module Dahdit.LiftedPrimArray ( LiftedPrimArray (..) , MutableLiftedPrimArray (..) , emptyLiftedPrimArray , indexLiftedPrimArray , writeLiftedPrimArray , freezeLiftedPrimArray , thawLiftedPrimArray , unsafeFreezeLiftedPrimArray , unsafeThawLiftedPrimArray , liftedPrimArrayFromListN , liftedPrimArrayFromList , generateLiftedPrimArray , sizeofLiftedPrimArray , lengthLiftedPrimArray , cloneLiftedPrimArray , replicateLiftedPrimArray ) where import Control.Monad.Primitive (PrimMonad (..)) import Dahdit.LiftedPrim ( LiftedPrim (..) , indexArrayLiftedInElems , writeArrayLiftedInElems ) import Dahdit.Proxy (proxyFor, proxyForF) import Dahdit.Sizes (ByteCount (..), ElemCount (..), StaticByteSized (..)) import Data.Coerce (coerce) import Data.Default (Default (..)) import Data.Foldable (for_) import Data.Primitive.ByteArray ( ByteArray , MutableByteArray , cloneByteArray , emptyByteArray , freezeByteArray , newByteArray , runByteArray , sizeofByteArray , thawByteArray , unsafeFreezeByteArray , unsafeThawByteArray ) import Data.Proxy (Proxy (..)) import Data.STRef (modifySTRef', newSTRef, readSTRef) newtype LiftedPrimArray a = LiftedPrimArray {forall a. LiftedPrimArray a -> ByteArray unLiftedPrimArray :: ByteArray} deriving stock (Int -> LiftedPrimArray a -> ShowS [LiftedPrimArray a] -> ShowS LiftedPrimArray a -> String (Int -> LiftedPrimArray a -> ShowS) -> (LiftedPrimArray a -> String) -> ([LiftedPrimArray a] -> ShowS) -> Show (LiftedPrimArray a) forall a. Int -> LiftedPrimArray a -> ShowS forall a. [LiftedPrimArray a] -> ShowS forall a. LiftedPrimArray a -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a $cshowsPrec :: forall a. Int -> LiftedPrimArray a -> ShowS showsPrec :: Int -> LiftedPrimArray a -> ShowS $cshow :: forall a. LiftedPrimArray a -> String show :: LiftedPrimArray a -> String $cshowList :: forall a. [LiftedPrimArray a] -> ShowS showList :: [LiftedPrimArray a] -> ShowS Show) deriving newtype (LiftedPrimArray a -> LiftedPrimArray a -> Bool (LiftedPrimArray a -> LiftedPrimArray a -> Bool) -> (LiftedPrimArray a -> LiftedPrimArray a -> Bool) -> Eq (LiftedPrimArray a) forall a. LiftedPrimArray a -> LiftedPrimArray a -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a $c== :: forall a. LiftedPrimArray a -> LiftedPrimArray a -> Bool == :: LiftedPrimArray a -> LiftedPrimArray a -> Bool $c/= :: forall a. LiftedPrimArray a -> LiftedPrimArray a -> Bool /= :: LiftedPrimArray a -> LiftedPrimArray a -> Bool Eq, Eq (LiftedPrimArray a) Eq (LiftedPrimArray a) => (LiftedPrimArray a -> LiftedPrimArray a -> Ordering) -> (LiftedPrimArray a -> LiftedPrimArray a -> Bool) -> (LiftedPrimArray a -> LiftedPrimArray a -> Bool) -> (LiftedPrimArray a -> LiftedPrimArray a -> Bool) -> (LiftedPrimArray a -> LiftedPrimArray a -> Bool) -> (LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a) -> (LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a) -> Ord (LiftedPrimArray a) LiftedPrimArray a -> LiftedPrimArray a -> Bool LiftedPrimArray a -> LiftedPrimArray a -> Ordering LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a forall a. Eq (LiftedPrimArray a) forall a. Eq a => (a -> a -> Ordering) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> a) -> (a -> a -> a) -> Ord a forall a. LiftedPrimArray a -> LiftedPrimArray a -> Bool forall a. LiftedPrimArray a -> LiftedPrimArray a -> Ordering forall a. LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a $ccompare :: forall a. LiftedPrimArray a -> LiftedPrimArray a -> Ordering compare :: LiftedPrimArray a -> LiftedPrimArray a -> Ordering $c< :: forall a. LiftedPrimArray a -> LiftedPrimArray a -> Bool < :: LiftedPrimArray a -> LiftedPrimArray a -> Bool $c<= :: forall a. LiftedPrimArray a -> LiftedPrimArray a -> Bool <= :: LiftedPrimArray a -> LiftedPrimArray a -> Bool $c> :: forall a. LiftedPrimArray a -> LiftedPrimArray a -> Bool > :: LiftedPrimArray a -> LiftedPrimArray a -> Bool $c>= :: forall a. LiftedPrimArray a -> LiftedPrimArray a -> Bool >= :: LiftedPrimArray a -> LiftedPrimArray a -> Bool $cmax :: forall a. LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a max :: LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a $cmin :: forall a. LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a min :: LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a Ord, NonEmpty (LiftedPrimArray a) -> LiftedPrimArray a LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a (LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a) -> (NonEmpty (LiftedPrimArray a) -> LiftedPrimArray a) -> (forall b. Integral b => b -> LiftedPrimArray a -> LiftedPrimArray a) -> Semigroup (LiftedPrimArray a) forall b. Integral b => b -> LiftedPrimArray a -> LiftedPrimArray a forall a. NonEmpty (LiftedPrimArray a) -> LiftedPrimArray a forall a. LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a forall a. (a -> a -> a) -> (NonEmpty a -> a) -> (forall b. Integral b => b -> a -> a) -> Semigroup a forall a b. Integral b => b -> LiftedPrimArray a -> LiftedPrimArray a $c<> :: forall a. LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a <> :: LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a $csconcat :: forall a. NonEmpty (LiftedPrimArray a) -> LiftedPrimArray a sconcat :: NonEmpty (LiftedPrimArray a) -> LiftedPrimArray a $cstimes :: forall a b. Integral b => b -> LiftedPrimArray a -> LiftedPrimArray a stimes :: forall b. Integral b => b -> LiftedPrimArray a -> LiftedPrimArray a Semigroup, Semigroup (LiftedPrimArray a) LiftedPrimArray a Semigroup (LiftedPrimArray a) => LiftedPrimArray a -> (LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a) -> ([LiftedPrimArray a] -> LiftedPrimArray a) -> Monoid (LiftedPrimArray a) [LiftedPrimArray a] -> LiftedPrimArray a LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a forall a. Semigroup (LiftedPrimArray a) forall a. LiftedPrimArray a forall a. Semigroup a => a -> (a -> a -> a) -> ([a] -> a) -> Monoid a forall a. [LiftedPrimArray a] -> LiftedPrimArray a forall a. LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a $cmempty :: forall a. LiftedPrimArray a mempty :: LiftedPrimArray a $cmappend :: forall a. LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a mappend :: LiftedPrimArray a -> LiftedPrimArray a -> LiftedPrimArray a $cmconcat :: forall a. [LiftedPrimArray a] -> LiftedPrimArray a mconcat :: [LiftedPrimArray a] -> LiftedPrimArray a Monoid) instance Default (LiftedPrimArray a) where def :: LiftedPrimArray a def = LiftedPrimArray a forall a. LiftedPrimArray a emptyLiftedPrimArray newtype MutableLiftedPrimArray m a = MutableLiftedPrimArray {forall m a. MutableLiftedPrimArray m a -> MutableByteArray m unMutableLiftedPrimArray :: MutableByteArray m} deriving newtype (MutableLiftedPrimArray m a -> MutableLiftedPrimArray m a -> Bool (MutableLiftedPrimArray m a -> MutableLiftedPrimArray m a -> Bool) -> (MutableLiftedPrimArray m a -> MutableLiftedPrimArray m a -> Bool) -> Eq (MutableLiftedPrimArray m a) forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a forall m a. MutableLiftedPrimArray m a -> MutableLiftedPrimArray m a -> Bool $c== :: forall m a. MutableLiftedPrimArray m a -> MutableLiftedPrimArray m a -> Bool == :: MutableLiftedPrimArray m a -> MutableLiftedPrimArray m a -> Bool $c/= :: forall m a. MutableLiftedPrimArray m a -> MutableLiftedPrimArray m a -> Bool /= :: MutableLiftedPrimArray m a -> MutableLiftedPrimArray m a -> Bool Eq) emptyLiftedPrimArray :: LiftedPrimArray a emptyLiftedPrimArray :: forall a. LiftedPrimArray a emptyLiftedPrimArray = ByteArray -> LiftedPrimArray a forall a. ByteArray -> LiftedPrimArray a LiftedPrimArray ByteArray emptyByteArray indexLiftedPrimArray :: (LiftedPrim a) => LiftedPrimArray a -> ElemCount -> a indexLiftedPrimArray :: forall a. LiftedPrim a => LiftedPrimArray a -> ElemCount -> a indexLiftedPrimArray (LiftedPrimArray ByteArray arr) = Proxy a -> ByteArray -> ElemCount -> a forall a. LiftedPrim a => Proxy a -> ByteArray -> ElemCount -> a indexArrayLiftedInElems Proxy a forall {k} (t :: k). Proxy t Proxy ByteArray arr writeLiftedPrimArray :: (LiftedPrim a, PrimMonad m) => MutableLiftedPrimArray (PrimState m) a -> ElemCount -> a -> m () writeLiftedPrimArray :: forall a (m :: * -> *). (LiftedPrim a, PrimMonad m) => MutableLiftedPrimArray (PrimState m) a -> ElemCount -> a -> m () writeLiftedPrimArray (MutableLiftedPrimArray MutableByteArray (PrimState m) arr) = MutableByteArray (PrimState m) -> ElemCount -> a -> m () forall (m :: * -> *) a. (PrimMonad m, LiftedPrim a) => MutableByteArray (PrimState m) -> ElemCount -> a -> m () writeArrayLiftedInElems MutableByteArray (PrimState m) arr freezeLiftedPrimArray :: (PrimMonad m) => MutableLiftedPrimArray (PrimState m) a -> ElemCount -> ElemCount -> m (LiftedPrimArray a) freezeLiftedPrimArray :: forall (m :: * -> *) a. PrimMonad m => MutableLiftedPrimArray (PrimState m) a -> ElemCount -> ElemCount -> m (LiftedPrimArray a) freezeLiftedPrimArray (MutableLiftedPrimArray MutableByteArray (PrimState m) arr) ElemCount off ElemCount len = (ByteArray -> LiftedPrimArray a) -> m ByteArray -> m (LiftedPrimArray a) forall a b. (a -> b) -> m a -> m b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap ByteArray -> LiftedPrimArray a forall a. ByteArray -> LiftedPrimArray a LiftedPrimArray (MutableByteArray (PrimState m) -> Int -> Int -> m ByteArray forall (m :: * -> *). PrimMonad m => MutableByteArray (PrimState m) -> Int -> Int -> m ByteArray freezeByteArray MutableByteArray (PrimState m) arr (ElemCount -> Int forall a b. Coercible a b => a -> b coerce ElemCount off) (ElemCount -> Int forall a b. Coercible a b => a -> b coerce ElemCount len)) unsafeFreezeLiftedPrimArray :: (PrimMonad m) => MutableLiftedPrimArray (PrimState m) a -> m (LiftedPrimArray a) unsafeFreezeLiftedPrimArray :: forall (m :: * -> *) a. PrimMonad m => MutableLiftedPrimArray (PrimState m) a -> m (LiftedPrimArray a) unsafeFreezeLiftedPrimArray (MutableLiftedPrimArray MutableByteArray (PrimState m) arr) = (ByteArray -> LiftedPrimArray a) -> m ByteArray -> m (LiftedPrimArray a) forall a b. (a -> b) -> m a -> m b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap ByteArray -> LiftedPrimArray a forall a. ByteArray -> LiftedPrimArray a LiftedPrimArray (MutableByteArray (PrimState m) -> m ByteArray forall (m :: * -> *). PrimMonad m => MutableByteArray (PrimState m) -> m ByteArray unsafeFreezeByteArray MutableByteArray (PrimState m) arr) thawLiftedPrimArray :: (PrimMonad m) => LiftedPrimArray a -> ElemCount -> ElemCount -> m (MutableLiftedPrimArray (PrimState m) a) thawLiftedPrimArray :: forall (m :: * -> *) a. PrimMonad m => LiftedPrimArray a -> ElemCount -> ElemCount -> m (MutableLiftedPrimArray (PrimState m) a) thawLiftedPrimArray (LiftedPrimArray ByteArray arr) ElemCount off ElemCount len = (MutableByteArray (PrimState m) -> MutableLiftedPrimArray (PrimState m) a) -> m (MutableByteArray (PrimState m)) -> m (MutableLiftedPrimArray (PrimState m) a) forall a b. (a -> b) -> m a -> m b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap MutableByteArray (PrimState m) -> MutableLiftedPrimArray (PrimState m) a forall m a. MutableByteArray m -> MutableLiftedPrimArray m a MutableLiftedPrimArray (ByteArray -> Int -> Int -> m (MutableByteArray (PrimState m)) forall (m :: * -> *). PrimMonad m => ByteArray -> Int -> Int -> m (MutableByteArray (PrimState m)) thawByteArray ByteArray arr (ElemCount -> Int forall a b. Coercible a b => a -> b coerce ElemCount off) (ElemCount -> Int forall a b. Coercible a b => a -> b coerce ElemCount len)) unsafeThawLiftedPrimArray :: (PrimMonad m) => LiftedPrimArray a -> m (MutableLiftedPrimArray (PrimState m) a) unsafeThawLiftedPrimArray :: forall (m :: * -> *) a. PrimMonad m => LiftedPrimArray a -> m (MutableLiftedPrimArray (PrimState m) a) unsafeThawLiftedPrimArray (LiftedPrimArray ByteArray arr) = (MutableByteArray (PrimState m) -> MutableLiftedPrimArray (PrimState m) a) -> m (MutableByteArray (PrimState m)) -> m (MutableLiftedPrimArray (PrimState m) a) forall a b. (a -> b) -> m a -> m b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap MutableByteArray (PrimState m) -> MutableLiftedPrimArray (PrimState m) a forall m a. MutableByteArray m -> MutableLiftedPrimArray m a MutableLiftedPrimArray (ByteArray -> m (MutableByteArray (PrimState m)) forall (m :: * -> *). PrimMonad m => ByteArray -> m (MutableByteArray (PrimState m)) unsafeThawByteArray ByteArray arr) liftedPrimArrayFromListN :: (LiftedPrim a) => ElemCount -> [a] -> LiftedPrimArray a liftedPrimArrayFromListN :: forall a. LiftedPrim a => ElemCount -> [a] -> LiftedPrimArray a liftedPrimArrayFromListN ElemCount n [a] xs = ByteArray -> LiftedPrimArray a forall a. ByteArray -> LiftedPrimArray a LiftedPrimArray (ByteArray -> LiftedPrimArray a) -> ByteArray -> LiftedPrimArray a forall a b. (a -> b) -> a -> b $ (forall s. ST s (MutableByteArray s)) -> ByteArray runByteArray ((forall s. ST s (MutableByteArray s)) -> ByteArray) -> (forall s. ST s (MutableByteArray s)) -> ByteArray forall a b. (a -> b) -> a -> b $ do let elemSize :: ByteCount elemSize = Proxy a -> ByteCount forall a. StaticByteSized a => Proxy a -> ByteCount staticByteSize ([a] -> Proxy a forall (f :: * -> *) a. f a -> Proxy a proxyForF [a] xs) len :: Int len = ElemCount -> Int forall a b. Coercible a b => a -> b coerce ElemCount n Int -> Int -> Int forall a. Num a => a -> a -> a * ByteCount -> Int forall a b. Coercible a b => a -> b coerce ByteCount elemSize MutableByteArray s arr <- Int -> ST s (MutableByteArray (PrimState (ST s))) forall (m :: * -> *). PrimMonad m => Int -> m (MutableByteArray (PrimState m)) newByteArray Int len STRef s ByteCount offRef <- ByteCount -> ST s (STRef s ByteCount) forall a s. a -> ST s (STRef s a) newSTRef ByteCount 0 [a] -> (a -> ST s ()) -> ST s () forall (t :: * -> *) (f :: * -> *) a b. (Foldable t, Applicative f) => t a -> (a -> f b) -> f () for_ [a] xs ((a -> ST s ()) -> ST s ()) -> (a -> ST s ()) -> ST s () forall a b. (a -> b) -> a -> b $ \a x -> do ByteCount off <- STRef s ByteCount -> ST s ByteCount forall s a. STRef s a -> ST s a readSTRef STRef s ByteCount offRef MutableByteArray (PrimState (ST s)) -> ByteCount -> a -> ST s () forall a (m :: * -> *). (LiftedPrim a, PrimMonad m) => MutableByteArray (PrimState m) -> ByteCount -> a -> m () forall (m :: * -> *). PrimMonad m => MutableByteArray (PrimState m) -> ByteCount -> a -> m () writeArrayLiftedInBytes MutableByteArray s MutableByteArray (PrimState (ST s)) arr ByteCount off a x STRef s ByteCount -> (ByteCount -> ByteCount) -> ST s () forall s a. STRef s a -> (a -> a) -> ST s () modifySTRef' STRef s ByteCount offRef (ByteCount elemSize ByteCount -> ByteCount -> ByteCount forall a. Num a => a -> a -> a +) MutableByteArray s -> ST s (MutableByteArray s) forall a. a -> ST s a forall (f :: * -> *) a. Applicative f => a -> f a pure MutableByteArray s arr liftedPrimArrayFromList :: (LiftedPrim a) => [a] -> LiftedPrimArray a liftedPrimArrayFromList :: forall a. LiftedPrim a => [a] -> LiftedPrimArray a liftedPrimArrayFromList [a] xs = ElemCount -> [a] -> LiftedPrimArray a forall a. LiftedPrim a => ElemCount -> [a] -> LiftedPrimArray a liftedPrimArrayFromListN (Int -> ElemCount forall a b. Coercible a b => a -> b coerce ([a] -> Int forall a. [a] -> Int forall (t :: * -> *) a. Foldable t => t a -> Int length [a] xs)) [a] xs generateLiftedPrimArray :: (LiftedPrim a) => ElemCount -> (ElemCount -> a) -> LiftedPrimArray a generateLiftedPrimArray :: forall a. LiftedPrim a => ElemCount -> (ElemCount -> a) -> LiftedPrimArray a generateLiftedPrimArray ElemCount n ElemCount -> a f = ElemCount -> [a] -> LiftedPrimArray a forall a. LiftedPrim a => ElemCount -> [a] -> LiftedPrimArray a liftedPrimArrayFromListN ElemCount n ((ElemCount -> a) -> [ElemCount] -> [a] forall a b. (a -> b) -> [a] -> [b] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap ElemCount -> a f [ElemCount 0 .. ElemCount n ElemCount -> ElemCount -> ElemCount forall a. Num a => a -> a -> a - ElemCount 1]) sizeofLiftedPrimArray :: LiftedPrimArray a -> ByteCount sizeofLiftedPrimArray :: forall a. LiftedPrimArray a -> ByteCount sizeofLiftedPrimArray (LiftedPrimArray ByteArray arr) = Int -> ByteCount forall a b. Coercible a b => a -> b coerce (ByteArray -> Int sizeofByteArray ByteArray arr) lengthLiftedPrimArray :: (LiftedPrim a) => LiftedPrimArray a -> ElemCount lengthLiftedPrimArray :: forall a. LiftedPrim a => LiftedPrimArray a -> ElemCount lengthLiftedPrimArray pa :: LiftedPrimArray a pa@(LiftedPrimArray ByteArray arr) = let elemSize :: Int elemSize = ByteCount -> Int forall a b. Coercible a b => a -> b coerce (Proxy a -> ByteCount forall a. StaticByteSized a => Proxy a -> ByteCount staticByteSize (LiftedPrimArray a -> Proxy a forall (f :: * -> *) a. f a -> Proxy a proxyForF LiftedPrimArray a pa)) arrSize :: Int arrSize = ByteArray -> Int sizeofByteArray ByteArray arr in Int -> ElemCount forall a b. Coercible a b => a -> b coerce (Int -> Int -> Int forall a. Integral a => a -> a -> a div Int arrSize Int elemSize) cloneLiftedPrimArray :: (LiftedPrim a) => LiftedPrimArray a -> ElemCount -> ElemCount -> LiftedPrimArray a cloneLiftedPrimArray :: forall a. LiftedPrim a => LiftedPrimArray a -> ElemCount -> ElemCount -> LiftedPrimArray a cloneLiftedPrimArray pa :: LiftedPrimArray a pa@(LiftedPrimArray ByteArray arr) ElemCount off ElemCount len = let elemSize :: ByteCount elemSize = Proxy a -> ByteCount forall a. StaticByteSized a => Proxy a -> ByteCount staticByteSize (LiftedPrimArray a -> Proxy a forall (f :: * -> *) a. f a -> Proxy a proxyForF LiftedPrimArray a pa) byteOff :: ByteCount byteOff = ElemCount -> ByteCount forall a b. Coercible a b => a -> b coerce ElemCount off ByteCount -> ByteCount -> ByteCount forall a. Num a => a -> a -> a * ByteCount elemSize byteLen :: ByteCount byteLen = ElemCount -> ByteCount forall a b. Coercible a b => a -> b coerce ElemCount len ByteCount -> ByteCount -> ByteCount forall a. Num a => a -> a -> a * ByteCount elemSize arr' :: ByteArray arr' = ByteArray -> Int -> Int -> ByteArray cloneByteArray ByteArray arr (ByteCount -> Int forall a b. Coercible a b => a -> b coerce ByteCount byteOff) (ByteCount -> Int forall a b. Coercible a b => a -> b coerce ByteCount byteLen) in ByteArray -> LiftedPrimArray a forall a. ByteArray -> LiftedPrimArray a LiftedPrimArray ByteArray arr' replicateLiftedPrimArray :: (LiftedPrim a) => ElemCount -> a -> LiftedPrimArray a replicateLiftedPrimArray :: forall a. LiftedPrim a => ElemCount -> a -> LiftedPrimArray a replicateLiftedPrimArray ElemCount len a val = ByteArray -> LiftedPrimArray a forall a. ByteArray -> LiftedPrimArray a LiftedPrimArray (ByteArray -> LiftedPrimArray a) -> ByteArray -> LiftedPrimArray a forall a b. (a -> b) -> a -> b $ (forall s. ST s (MutableByteArray s)) -> ByteArray runByteArray ((forall s. ST s (MutableByteArray s)) -> ByteArray) -> (forall s. ST s (MutableByteArray s)) -> ByteArray forall a b. (a -> b) -> a -> b $ do let elemSize :: ByteCount elemSize = Proxy a -> ByteCount forall a. StaticByteSized a => Proxy a -> ByteCount staticByteSize (a -> Proxy a forall a. a -> Proxy a proxyFor a val) byteLen :: ByteCount byteLen = ElemCount -> ByteCount forall a b. Coercible a b => a -> b coerce ElemCount len ByteCount -> ByteCount -> ByteCount forall a. Num a => a -> a -> a * ByteCount elemSize MutableByteArray s arr <- Int -> ST s (MutableByteArray (PrimState (ST s))) forall (m :: * -> *). PrimMonad m => Int -> m (MutableByteArray (PrimState m)) newByteArray (ByteCount -> Int forall a b. Coercible a b => a -> b coerce ByteCount byteLen) [ElemCount] -> (ElemCount -> ST s ()) -> ST s () forall (t :: * -> *) (f :: * -> *) a b. (Foldable t, Applicative f) => t a -> (a -> f b) -> f () for_ [ElemCount 0 .. ElemCount len ElemCount -> ElemCount -> ElemCount forall a. Num a => a -> a -> a - ElemCount 1] ((ElemCount -> ST s ()) -> ST s ()) -> (ElemCount -> ST s ()) -> ST s () forall a b. (a -> b) -> a -> b $ \ElemCount pos -> MutableByteArray (PrimState (ST s)) -> ByteCount -> a -> ST s () forall a (m :: * -> *). (LiftedPrim a, PrimMonad m) => MutableByteArray (PrimState m) -> ByteCount -> a -> m () forall (m :: * -> *). PrimMonad m => MutableByteArray (PrimState m) -> ByteCount -> a -> m () writeArrayLiftedInBytes MutableByteArray s MutableByteArray (PrimState (ST s)) arr (ElemCount -> ByteCount forall a b. Coercible a b => a -> b coerce ElemCount pos ByteCount -> ByteCount -> ByteCount forall a. Num a => a -> a -> a * ByteCount elemSize) a val MutableByteArray s -> ST s (MutableByteArray s) forall a. a -> ST s a forall (f :: * -> *) a. Applicative f => a -> f a pure MutableByteArray s arr