úÎhÀbûh      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au>   !"   !" "!     !" non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au>#,Class of primitive state-transformer monads $State token type %Execute a primitive operation &+Expose the internal structure of the monad '-Execute a primitive operation with no result ( Convert a #- to another monad with the same state token. ) Convert a # with a  state token to hi * Convert a # to j + Convert a #2 to another monad with a possibly different state ) token. This operation is highly unsafe! , Convert any # to j% with an arbitrary state token. This  operations is highly unsafe! - Convert any # to hi#. This operation is highly unsafe! ./01#$%&'()*+,-./01#$%&'()*+-,./01#$%&$%&'()*+,-./01 non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au> 25Class of types supporting primitive array operations 3Size of values of type a. The argument is not used. 4Alignment of values of type a. The argument is not used. 5?Read a value from the array. The offset is in elements of type  a rather than in bytes. 6GRead a value from the mutable array. The offset is in elements of type  a rather than in bytes. 7FWrite a value to the mutable array. The offset is in elements of type  a rather than in bytes. 8GRead a value from a memory position given by an address and an offset. L The memory block the address refers to must be immutable. The offset is in  elements of type a rather than in bytes. 9GRead a value from a memory position given by an address and an offset. # The offset is in elements of type a rather than in bytes. :FWrite a value to a memory position given by an address and an offset. # The offset is in elements of type a rather than in bytes. ;A machine address <k 23456789:;< 23456789:;< 23456789:3456789:;<< non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au> =>Mutable boxed arrays associated with a primitive state token. >? Boxed arrays @ADCreate a new mutable array of the specified size and initialise all  elements with the given value. B0Read a value from the array at the given index. C/Write a value to the array at the given index. D:Read a value from the immutable array at the given index. EFMonadically read a value from the immutable array at the given index. K This allows us to be strict in the array while remaining lazy in the read L element which is very useful for collective operations. Suppose we want to 1 copy an array. We could do something like this:   copy marr arr ... = do ... A writeArray marr i (indexArray arr i) ...  ... 2But since primitive arrays are lazy, the calls to D will not be  evaluated. Rather, marr0 will be filled with thunks each of which would  retain a reference to arr'. This is definitely not what we want! With E, we can instead write   copy marr arr ... = do ... / x <- indexArrayM arr i , writeArray marr i x  ... GNow, indexing is executed immediately although the returned element is  still not evaluated. FAConvert a mutable array to an immutable one without copying. The 4 array should not be modified after the conversion. GBConvert an immutable array to an mutable one without copying. The : immutable array should not be used after the conversion. H=Check whether the two arrays refer to the same memory block. =>?@ABCDEFGH ?@=>ABCDEFGH =>>?@@ABCDEFGH non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au>I<Mutable byte arrays associated with a primitive state token JK Byte arrays LlmnoM7Create a new mutable byte array of the specified size. N Create a pinned9 byte array of the specified size. The garbage collector  is guaranteed not to move it. O Create a pinned4 byte array of the specified size and with the give @ alignment. The garbage collector is guaranteed not to move it. PYield a pointer to the array''s data. This operation is only safe on  pinned byte arrays allocated by N or  O. QYield a pointer to the array''s data. This operation is only safe on  pinned byte arrays allocated by N or  O. R8Check if the two arrays refer to the same memory block. SFConvert a mutable byte array to an immutable one without copying. The 4 array should not be modified after the conversion. TFConvert an immutable byte array to a mutable one without copying. The 9 original array should not be used after the conversion. USize of the byte array. V Size of the mutable byte array. WCRead a primitive value from the byte array. The offset is given in  elements of type a rather than in bytes. XCRead a primitive value from the byte array. The offset is given in  elements of type a rather than in bytes. YBWrite a primitive value to the byte array. The offset is given in  elements of type a rather than in bytes. Z[\]IJKLMNOPQRSTUVWXYZ[\]KLIJMNOXYWSTUVRPQZ[\]IJJKLLMNOPQRSTUVWXYZ[\] non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au>^The null address _/Offset an address by the given number of bytes `IDistance in bytes between two addresses. The result is only valid if the  difference fits in an p. abGRead a value from a memory position given by an address and an offset. L The memory block the address refers to must be immutable. The offset is in  elements of type a rather than in bytes. cGRead a value from a memory position given by an address and an offset. # The offset is in elements of type a rather than in bytes. dFWrite a value to a memory position given by an address and an offset. # The offset is in elements of type a rather than in bytes. e ;<^_`abcde ;<^_`abcde^_`abcde non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au>fSize of values of type a. The argument is not used. gAlignment of values of type a. The argument is not used. 823456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgfgfgq        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEEFFGGHIJKLMNOPPQQRSTUVWXYZ[\]^_`abcdefghijklmnmnopqrstuvmwxprimitive-0.3.1Data.Primitive.ByteArrayControl.Monad.PrimitiveData.Primitive.MachDepsData.Primitive.TypesData.Primitive.ArrayData.Primitive.AddrData.Primitiveghc-primGHC.Prim ByteArray#MutableByteArray# RealWorld sIZEOF_CHARaLIGNMENT_CHAR sIZEOF_INT aLIGNMENT_INT sIZEOF_WORDaLIGNMENT_WORD sIZEOF_DOUBLEaLIGNMENT_DOUBLE sIZEOF_FLOATaLIGNMENT_FLOAT sIZEOF_PTR aLIGNMENT_PTR sIZEOF_FUNPTRaLIGNMENT_FUNPTRsIZEOF_STABLEPTRaLIGNMENT_STABLEPTR sIZEOF_INT8aLIGNMENT_INT8 sIZEOF_WORD8aLIGNMENT_WORD8 sIZEOF_INT16aLIGNMENT_INT16 sIZEOF_WORD16aLIGNMENT_WORD16 sIZEOF_INT32aLIGNMENT_INT32 sIZEOF_WORD32aLIGNMENT_WORD32 sIZEOF_INT64aLIGNMENT_INT64 sIZEOF_WORD64aLIGNMENT_WORD64 PrimMonad PrimState primitiveinternal primitive_ primToPrimprimToIOprimToSTunsafePrimToPrimunsafePrimToSTunsafePrimToIOunsafeInlinePrimunsafeInlineIOunsafeInlineSTtouchPrimsizeOf# alignment#indexByteArray#readByteArray#writeByteArray# indexOffAddr# readOffAddr# writeOffAddr#Addr MutableArrayArraynewArray readArray writeArray indexArray indexArrayMunsafeFreezeArrayunsafeThawArraysameMutableArrayMutableByteArray ByteArray newByteArraynewPinnedByteArraynewAlignedPinnedByteArraybyteArrayContentsmutableByteArrayContentssameMutableByteArrayunsafeFreezeByteArrayunsafeThawByteArraysizeofByteArraysizeofMutableByteArrayindexByteArray readByteArraywriteByteArraymemcpyByteArraymemcpyByteArray'memmoveByteArraymemsetByteArraynullAddrplusAddr minusAddrremAddr indexOffAddr readOffAddr writeOffAddr memcpyAddrsizeOf alignment GHC.TypesIObaseGHC.STSTunI# memset_mba memmove_mba memcpy_ba memcpy_mbaInt