úÎZAUèS      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQR 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 #-Execute a primitive operation with no result  !"# !"# !"!"# non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au> $5Class of types supporting primitive array operations %Size of values of type a. The argument is not used. &Alignment of values of type a. The argument is not used. '?Read a value from the array. The offset is in elements of type  a rather than in bytes. (GRead a value from the mutable array. The offset is in elements of type  a rather than in bytes. )FWrite a value to the mutable array. 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. 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. ,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 .S $%&'()*+,-. $%&'()*+,-. $%&'()*+,%&'()*+,-.. non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au> />Mutable boxed arrays associated with a primitive state token. 01 Boxed arrays 23DCreate a new mutable array of the specified size and initialise all  elements with the given value. 40Read a value from the array at the given index. 5/Write a value to the array at the given index. 6:Read a value from the immutable array at the given index. 7FMonadically 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 6 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 7, 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. 8AConvert a mutable array to an immutable one without copying. The 4 array should not be modified after the conversion. 9BConvert an immutable array to an mutable one without copying. The : immutable array should not be used after the conversion. :=Check whether the two arrays refer to the same memory block. /0123456789: 12/03456789: /001223456789: non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au>;<Mutable byte arrays associated with a primitive state token <= Byte arrays >?7Create a new mutable byte array of the specified size. @ Create a pinned9 byte array of the specified size. The garbage collector  is guaranteed not to move it. A Create a pinned4 byte array of the specified size and with the give @ alignment. The garbage collector is guaranteed not to move it. BYield a pointer to the array''s data. This operation is only safe on  pinned byte arrays allocated by @ or  A. C8Check if the two arrays refer to the same memory block. DFConvert a mutable byte array to an immutable one without copying. The 4 array should not be modified after the conversion. ESize of the byte array. F Size of the mutable byte array. GCRead a primitive value from the byte array. The offset is given in  elements of type a rather than in bytes. HCRead a primitive value from the byte array. The offset is given in  elements of type a rather than in bytes. IBWrite a primitive value to the byte array. The offset is given in  elements of type a rather than in bytes. ;<=>?@ABCDEFGHI=>;<?@AHIGDEFCB;<<=>>?@ABCDEFGHI non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au>JThe null address K/Offset an address by the given number of bytes LIDistance in bytes between two addresses. The result is only valid if the  difference fits in an T. MNGRead 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. OGRead 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. PFWrite 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. -.JKLMNOP -.JKLMNOPJKLMNOP non-portable'Roman Leshchinskiy <rl@cse.unsw.edu.au>QSize of values of type a. The argument is not used. RAlignment of values of type a. The argument is not used. /$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRQRQRU      !"#$%&'()*+,-./0123455667789:;<=>?@@AABCDEFGHIJKLMNOPQRSTUVWXYZ primitive-0.1Data.Primitive.MachDepsControl.Monad.PrimitiveData.Primitive.TypesData.Primitive.ArrayData.Primitive.ByteArrayData.Primitive.AddrData.Primitive 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 primitive primitive_PrimsizeOf# alignment#indexByteArray#readByteArray#writeByteArray# indexOffAddr# readOffAddr# writeOffAddr#Addr MutableArrayArraynewArray readArray writeArray indexArray indexArrayMunsafeFreezeArrayunsafeThawArraysameMutableArrayMutableByteArray ByteArray newByteArraynewPinnedByteArraynewAlignedPinnedByteArraybyteArrayContentssameMutableByteArrayunsafeFreezeByteArraysizeofByteArraysizeofMutableByteArrayindexByteArray readByteArraywriteByteArraynullAddrplusAddr minusAddrremAddr indexOffAddr readOffAddr writeOffAddrsizeOf alignmentunI#ghc-prim GHC.TypesInt