śĪ!ĄµH¤      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ”¢£ (c) Roman Leshchinskiy 2009 BSD-style'Roman Leshchinskiy <rl@cse.unsw.edu.au> non-portableNone =>?FHV  primitive8Class of primitive monads for state-transformer actions.Unlike #, this typeclass requires that the Monadp be fully expressed as a state transformer, therefore disallowing other monad transformers on top of the base IO or ST. primitive*Expose the internal structure of the monad primitiveEClass of monads which can perform primitive state-transformer actions primitiveState token type primitiveExecute a primitive operation primitive,Execute a primitive operation with no result  primitiveLifts a  into another , with the same underlying state token type.  primitive Convert a , to another monad with the same state token.  primitive Convert a  with a  state token to ¤  primitive Convert a  to „  primitive Convert a Z to another monad with a possibly different state token. This operation is highly unsafe! primitive Convert any  to „A with an arbitrary state token. This operation is highly unsafe! primitive Convert any  to ¤". This operation is highly unsafe!    (c) Roman Leshchinskiy 2011-2012 BSD-style'Roman Leshchinskiy <rl@cse.unsw.edu.au> non-portableNoneF[¦§ (c) Roman Leshchinskiy 2009-2012 BSD-style'Roman Leshchinskiy <rl@cse.unsw.edu.au> non-portableNone2FHź$ primitive=Mutable boxed arrays associated with a primitive state token.& primitive Boxed arrays( primitivecCreate a new mutable array of the specified size and initialise all elements with the given value.) primitive/Read a value from the array at the given index.* primitive.Write a value to the array at the given index.+ primitive9Read a value from the immutable array at the given index., primitive’ Monadically read a value from the immutable array at the given index. This allows us to be strict in the array while remaining lazy in the read element which is very useful for collective operations. Suppose we want to copy an array. We could do something like this: ucopy marr arr ... = do ... writeArray marr i (indexArray arr i) ... ...2But since primitive arrays are lazy, the calls to +! will not be evaluated. Rather, marrG will be filled with thunks each of which would retain a reference to arr&. This is definitely not what we want!With ,, we can instead write Žcopy marr arr ... = do ... x <- indexArrayM arr i writeArray marr i x ...\Now, indexing is executed immediately although the returned element is still not evaluated.- primitivetConvert a mutable array to an immutable one without copying. The array should not be modified after the conversion.. primitive{Convert an immutable array to an mutable one without copying. The immutable array should not be used after the conversion./ primitive<Check whether the two arrays refer to the same memory block.0 primitive6Copy a slice of an immutable array to a mutable array.1 primitiveVCopy a slice of a mutable array to another array. The two arrays may not be the same.2 primitive»Return a newly allocated Array with the specified subrange of the provided Array. The provided Array should contain the full subrange specified by the two Ints, but this is not checked.3 primitiveŃReturn a newly allocated MutableArray. with the specified subrange of the provided MutableArray. The provided MutableArray should contain the full subrange specified by the two Ints, but this is not checked.0 primitivedestination array primitiveoffset into destination array primitive source array primitiveoffset into source array primitivenumber of elements to copy1 primitivedestination array primitiveoffset into destination array primitive source array primitiveoffset into source array primitivenumber of elements to copy2 primitive source array primitiveoffset into destination array primitivenumber of elements to copy3 primitive source array primitiveoffset into destination array primitivenumber of elements to copy$%&'()*+,-./0123&'$%()*+,-./0123 (c) Roman Leshchinskiy 2009-2012 BSD-style'Roman Leshchinskiy <rl@cse.unsw.edu.au> non-portableNoneFK$"6789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW"89:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW76  (c) Roman Leshchinskiy 2011-2012 BSD-style'Roman Leshchinskiy <rl@cse.unsw.edu.au> non-portableNone FMŖ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆ4(c) Justin Bonnar 2011, Roman Leshchinskiy 2011-2012 BSD-style'Roman Leshchinskiy <rl@cse.unsw.edu.au> non-portableNone2FW§X primitiveA XV behaves like a single-element mutable array associated with a primitive state token.Z primitive Create a new X! with the specified initial value[ primitiveRead the value of a X\ primitiveWrite a new value into a X] primitive$Atomically mutate the contents of a X^ primitiveStrict version of ],. This forces both the value stored in the X as well as the value returned._ primitiveMutate the contents of a X` primitiveStrict version of _ XYZ[\]^_` XYZ[\]^_` (c) Roman Leshchinskiy 2009-2012 BSD-style'Roman Leshchinskiy <rl@cse.unsw.edu.au> non-portableNone2FnS b primitive4Class of types supporting primitive array operationsc primitiveSize of values of type a. The argument is not used.d primitiveAlignment of values of type a. The argument is not used.e primitive@Read a value from the array. The offset is in elements of type a rather than in bytes.f primitiveHRead a value from the mutable array. The offset is in elements of type a rather than in bytes.g primitiveGWrite a value to the mutable array. The offset is in elements of type a rather than in bytes.h primitivelFill a slice of the mutable array with a value. The offset and length of the chunk are in elements of type a rather than in bytes.i primitive„Read a value from a memory position given by an address and an offset. The memory block the address refers to must be immutable. The offset is in elements of type a rather than in bytes.j primitivejRead 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.k primitiveiWrite 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.l primitivepFill a memory block given by an address, an offset and a length. The offset and length are in elements of type a rather than in bytes.m primitiveA machine address bhcdefgijklmn bhcdefgijklmn (c) Roman Leshchinskiy 2009-2012 BSD-style'Roman Leshchinskiy <rl@cse.unsw.edu.au> non-portableNone 2Fš,€ primitive;Mutable byte arrays associated with a primitive state token‚ primitive Byte arrays„ primitive6Create a new mutable byte array of the specified size.… primitive Create a pinnedW byte array of the specified size. The garbage collector is guaranteed not to move it.† primitive Create a pinneds byte array of the specified size and with the give alignment. The garbage collector is guaranteed not to move it.‡ primitiveEYield a pointer to the array's data. This operation is only safe on pinned byte arrays allocated by … or †.ˆ primitiveEYield a pointer to the array's data. This operation is only safe on pinned byte arrays allocated by … or †.‰ primitive7Check if the two arrays refer to the same memory block.Š primitiveyConvert a mutable byte array to an immutable one without copying. The array should not be modified after the conversion.‹ primitive~Convert an immutable byte array to a mutable one without copying. The original array should not be used after the conversion.Œ primitiveSize of the byte array. primitiveSize of the mutable byte array.Ž primitiveURead a primitive value from the byte array. The offset is given in elements of type a rather than in bytes. primitiveURead a primitive value from the byte array. The offset is given in elements of type a rather than in bytes. primitiveTWrite a primitive value to the byte array. The offset is given in elements of type a rather than in bytes.‘ primitive@Copy a slice of an immutable byte array to a mutable byte array.’ primitiveYCopy a slice of a mutable byte array into another array. The two slices may not overlap.“ primitiveRCopy a slice of a mutable byte array into another, potentially overlapping array.” primitivehFill a slice of a mutable byte array with a value. The offset and length are given in elements of type a rather than in bytes.• primitive1Fill a slice of a mutable byte array with a byte.‘ primitivedestination array primitiveoffset into destination array primitive source array primitiveoffset into source array primitivenumber of bytes to copy’ primitivedestination array primitiveoffset into destination array primitive source array primitiveoffset into source array primitivenumber of bytes to copy“ primitivedestination array primitiveoffset into destination array primitive source array primitiveoffset into source array primitivenumber of bytes to copy” primitive array to fill primitiveoffset into array primitivenumber of values to fill primitivevalue to fill with• primitive array to fill primitiveoffset into array primitivenumber of bytes to fill primitivebyte to fill with€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•‚ƒ€„…†ŽŠ‹‘’“”•Œ‰‡ˆ (c) Roman Leshchinskiy 2009-2012 BSD-style'Roman Leshchinskiy <rl@cse.unsw.edu.au> non-portableNoneFÆ× ˜ primitiveThe null address™ primitive.Offset an address by the given number of bytesš primitive`Distance in bytes between two addresses. The result is only valid if the difference fits in an Ä.› primitive-The remainder of the address and the integer.œ primitive„Read a value from a memory position given by an address and an offset. The memory block the address refers to must be immutable. The offset is in elements of type a rather than in bytes. primitivejRead 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.ž primitiveiWrite 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.Ÿ primitive/Copy the given number of bytes from the second m* to the first. The areas may not overlap.  primitive/Copy the given number of bytes from the second m& to the first. The areas may overlap.” primitivePFill a memory block of with the given value. The length is in elements of type a rather than in bytes.Ÿ primitivedestination address primitivesource address primitivenumber of bytes  primitivedestination address primitivesource address primitivenumber of bytes mn˜™š›œžŸ ” mn˜™š›œžŸ ”™6š6›7 (c) Roman Leshchinskiy 2009-2012 BSD-style'Roman Leshchinskiy <rl@cse.unsw.edu.au> non-portableNoneF“8¢ primitiveSize of values of type a. The argument is not used.£ primitiveAlignment of values of type a. The argument is not used.A$%&'()*+,-./0123bhcdefgijklmn€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•˜™š›œžŸ ”¢£¢£Å    !"#$%&'()*+,-./011223456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abccdefghijklmnopqrstuvwwxyz{|}~€‚ƒ„…†‡ˆ‰‰ŠŠ‹ŒŽ‘’“”•–—˜™š›œžŸ ”¢£¤„¦§Ø©Ŗ «¬­®Æ­°± «² ³ “ µ ¶ · ø ¹ ŗ » ¼ ½ ¾ æ Ą Į Ā Ć Ä Å Ę Ē Č É Ź Ė Ģ Ķ Ī «ĻŠ(primitive-0.6.1.2-Cs3eX5At5n3A3gyEzpdnJbData.Primitive.ByteArrayControl.Monad.PrimitiveData.Primitive.ArrayData.Primitive.MachDepsData.Primitive.MutVarData.Primitive.TypesData.Primitive.AddrData.PrimitiveData.Primitive.Internal.Compat"Data.Primitive.Internal.Operationsghc-primGHC.Prim ByteArray#MutableByteArray# RealWorldPrimBaseinternal PrimMonad PrimState primitive primitive_liftPrim primToPrimprimToIOprimToSTunsafePrimToPrimunsafePrimToSTunsafePrimToIOunsafeInlinePrimunsafeInlineIOunsafeInlineSTtouch $fPrimMonadST$fPrimMonadRWST$fPrimMonadWriterT$fPrimMonadStateT$fPrimMonadExceptT$fPrimMonadRWST0$fPrimMonadWriterT0$fPrimMonadStateT0$fPrimMonadReaderT$fPrimMonadErrorT$fPrimMonadMaybeT$fPrimMonadListT$fPrimMonadIdentityT $fPrimMonadIO $fPrimBaseST $fPrimBaseIO MutableArrayArraynewArray readArray writeArray indexArray indexArrayMunsafeFreezeArrayunsafeThawArraysameMutableArray copyArraycopyMutableArray cloneArraycloneMutableArray $fDataArray$fDataMutableArrayInt64_#Word64_# 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_WORD64MutVar newMutVar readMutVar writeMutVaratomicModifyMutVaratomicModifyMutVar' modifyMutVar modifyMutVar' $fEqMutVarPrimsizeOf# alignment#indexByteArray#readByteArray#writeByteArray# setByteArray# indexOffAddr# readOffAddr# writeOffAddr# setOffAddr#Addr $fDataAddr $fOrdAddr$fEqAddr $fPrimAddr $fPrimChar $fPrimDouble $fPrimFloat $fPrimInt64 $fPrimInt32 $fPrimInt16 $fPrimInt8 $fPrimInt $fPrimWord64 $fPrimWord32 $fPrimWord16 $fPrimWord8 $fPrimWordMutableByteArray ByteArray newByteArraynewPinnedByteArraynewAlignedPinnedByteArraybyteArrayContentsmutableByteArrayContentssameMutableByteArrayunsafeFreezeByteArrayunsafeThawByteArraysizeofByteArraysizeofMutableByteArrayindexByteArray readByteArraywriteByteArray copyByteArraycopyMutableByteArray moveByteArray setByteArray fillByteArray$fDataByteArray$fDataMutableByteArraynullAddrplusAddr minusAddrremAddr indexOffAddr readOffAddr writeOffAddrcopyAddrmoveAddrsetAddrsizeOf alignment GHC.TypesIObaseGHC.STST Data.Data mkNoRepTypeisTrue#setWideCharOffAddr#setDoubleOffAddr#setFloatOffAddr#setAddrOffAddr#setIntOffAddr#setInt64OffAddr#setInt32OffAddr#setInt16OffAddr#setInt8OffAddr#setWordOffAddr#setWord64OffAddr#setWord32OffAddr#setWord16OffAddr#setWord8OffAddr#setWideCharArray#setDoubleArray#setFloatArray# setAddrArray# setIntArray#setInt64Array#setInt32Array#setInt16Array# setInt8Array# setWordArray#setWord64Array#setWord32Array#setWord16Array#setWord8Array#Int