-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Types for offsets into unboxed arrays -- -- Types for offsets into unboxed arrays @package primitive-offset @version 0.1.0.0 module Data.Primitive.ByteArray.Offset -- | A byte array and an index into the array. The element type is -- understood to be byte (an 8-bit word). data ByteArrayOffset ByteArrayOffset :: {-# UNPACK #-} !ByteArray -> {-# UNPACK #-} !Int -> ByteArrayOffset [$sel:array:ByteArrayOffset] :: ByteArrayOffset -> {-# UNPACK #-} !ByteArray [$sel:index:ByteArrayOffset] :: ByteArrayOffset -> {-# UNPACK #-} !Int -- | A mutable byte array and an index into the array. The element type is -- understood to be byte (an 8-bit word). data MutableByteArrayOffset s MutableByteArrayOffset :: {-# UNPACK #-} !MutableByteArray s -> {-# UNPACK #-} !Int -> MutableByteArrayOffset s [$sel:array:MutableByteArrayOffset] :: MutableByteArrayOffset s -> {-# UNPACK #-} !MutableByteArray s [$sel:index:MutableByteArrayOffset] :: MutableByteArrayOffset s -> {-# UNPACK #-} !Int -- | Data types for describing an array paired with an index into it. This -- is intended to be used in wrappers for unsafe FFI calls. For -- example, the POSIX function recvfrom takes a -- socklen_t* argument. (Let us assume that socklen_t -- is equivalant to int for this example.) How is this argument -- best described by a Haskell type? When working with pinned memory, the -- best option Ptr CInt. It works equally well -- regardless of whether we originally had an array of CInt or a -- pointer to a single CInt. This works because of functions -- like advancePtr and plusPtr that effectively index into -- an array. Unpinned memory, however, is trickier. We want to have the -- full flexibility (handling both a single-element or multi-element -- buffer) that Ptr CInt affords. We cannot -- offset into a MutablePrimArray to get a new one like we could -- with Ptr. (Such a function is not possible because unpinned -- memory can be relocated.) So, the offseting must be done in the C -- function wrapped by the unsafe FFI. This means that the -- offset must be passed together with the MutablePrimArray. This -- is the precisely the product that MutablePrimArrayOffset -- represents. In a type signature, it provides additional clarity about -- the meaning of the offset. -- -- This library is used in the extensively in the posix-api -- library to clarify intent in a number of type signatures. module Data.Primitive.PrimArray.Offset -- | A primitive array and an index into the array. data PrimArrayOffset a PrimArrayOffset :: {-# UNPACK #-} !PrimArray a -> {-# UNPACK #-} !Int -> PrimArrayOffset a [$sel:array:PrimArrayOffset] :: PrimArrayOffset a -> {-# UNPACK #-} !PrimArray a [$sel:index:PrimArrayOffset] :: PrimArrayOffset a -> {-# UNPACK #-} !Int -- | A mutable primitive array and an index into the array. data MutablePrimArrayOffset s a MutablePrimArrayOffset :: {-# UNPACK #-} !MutablePrimArray s a -> {-# UNPACK #-} !Int -> MutablePrimArrayOffset s a [$sel:array:MutablePrimArrayOffset] :: MutablePrimArrayOffset s a -> {-# UNPACK #-} !MutablePrimArray s a [$sel:index:MutablePrimArrayOffset] :: MutablePrimArrayOffset s a -> {-# UNPACK #-} !Int -- | Recover the element in the primitive array. indexOffset :: Prim a => PrimArrayOffset a -> a -- | Recover the element in the mutable primitive array. readOffset :: (PrimMonad m, Prim a) => MutablePrimArrayOffset (PrimState m) a -> m a