úÎd(^—d      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abc 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 de * Convert a # to f + Convert a #2 to another monad with a possibly different state ) token. This operation is highly unsafe! , Convert any # to f% with an arbitrary state token. This  operations is highly unsafe! - Convert any # to de#. This operation is highly unsafe! ./0#$%&'()*+,-./0#$%&'()*+-,./0#$%&$%&'()*+,-./0 non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au> 15Class of types supporting primitive array operations 2Size of values of type a. The argument is not used. 3Alignment of values of type a. The argument is not used. 4?Read a value from the array. The offset is in elements of type  a rather than in bytes. 5GRead a value from the mutable array. The offset is in elements of type  a rather than in bytes. 6FWrite a value to the mutable array. The offset is in elements of type  a rather than in bytes. 7GRead 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. 8GRead 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. 9FWrite 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 ;g 123456789:; 123456789:; 12345678923456789:;; non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au> <>Mutable boxed arrays associated with a primitive state token. => Boxed arrays ?@DCreate a new mutable array of the specified size and initialise all  elements with the given value. A0Read a value from the array at the given index. B/Write a value to the array at the given index. C:Read a value from the immutable array at the given index. DFMonadically 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 C 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 D, 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. EAConvert a mutable array to an immutable one without copying. The 4 array should not be modified after the conversion. FBConvert an immutable array to an mutable one without copying. The : immutable array should not be used after the conversion. G=Check whether the two arrays refer to the same memory block. <=>?@ABCDEFG >?<=@ABCDEFG <==>??@ABCDEFG non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au>hijkH<Mutable byte arrays associated with a primitive state token IJ Byte arrays KL7Create a new mutable byte array of the specified size. M Create a pinned9 byte array of the specified size. The garbage collector  is guaranteed not to move it. N Create a pinned4 byte array of the specified size and with the give @ alignment. The garbage collector is guaranteed not to move it. OYield a pointer to the array''s data. This operation is only safe on  pinned byte arrays allocated by M or  N. P8Check if the two arrays refer to the same memory block. QFConvert a mutable byte array to an immutable one without copying. The 4 array should not be modified after the conversion. RSize of the byte array. S Size of the mutable byte array. TCRead a primitive value from the byte array. The offset is given in  elements of type a rather than in bytes. UCRead a primitive value from the byte array. The offset is given in  elements of type a rather than in bytes. VBWrite a primitive value to the byte array. The offset is given in  elements of type a rather than in bytes. WXYZHIJKLMNOPQRSTUVWXYZJKHILMNUVTQRSPOWXYZHIIJKKLMNOPQRSTUVWXYZ 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 l. ^_GRead 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. `GRead 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. aFWrite 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 :;[\]^_`a[\]^_`a non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au>bSize of values of type a. The argument is not used. cAlignment of values of type a. The argument is not used. 5123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcbcbcm        !"#$%&'()*+,-./0123456789:;<=>?@ABCDDEEFFGHIJKLMNOOPPQRSTUVWXYZ[\]^_`abcdefghijijklmnopqrist primitive-0.3Data.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_ primToPrimprimToIOprimToSTunsafePrimToPrimunsafePrimToSTunsafePrimToIOunsafeInlinePrimunsafeInlineIOunsafeInlineSTPrimsizeOf# alignment#indexByteArray#readByteArray#writeByteArray# indexOffAddr# readOffAddr# writeOffAddr#Addr MutableArrayArraynewArray readArray writeArray indexArray indexArrayMunsafeFreezeArrayunsafeThawArraysameMutableArrayMutableByteArray ByteArray newByteArraynewPinnedByteArraynewAlignedPinnedByteArraybyteArrayContentssameMutableByteArrayunsafeFreezeByteArraysizeofByteArraysizeofMutableByteArrayindexByteArray readByteArraywriteByteArraymemcpyByteArraymemcpyByteArray'memmoveByteArraymemsetByteArraynullAddrplusAddr minusAddrremAddr indexOffAddr readOffAddr writeOffAddrsizeOf alignment GHC.TypesIObaseGHC.STSTunI# memset_mba memmove_mba memcpy_ba memcpy_mbaInt