summaryrefslogtreecommitdiff
path: root/haskell/Data/Primitive/ByteArray/Util.hs
diff options
context:
space:
mode:
Diffstat (limited to 'haskell/Data/Primitive/ByteArray/Util.hs')
-rw-r--r--haskell/Data/Primitive/ByteArray/Util.hs45
1 files changed, 45 insertions, 0 deletions
diff --git a/haskell/Data/Primitive/ByteArray/Util.hs b/haskell/Data/Primitive/ByteArray/Util.hs
new file mode 100644
index 0000000..1776286
--- /dev/null
+++ b/haskell/Data/Primitive/ByteArray/Util.hs
@@ -0,0 +1,45 @@
1{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE KindSignatures #-}
5{-# LANGUAGE MagicHash #-}
6{-# LANGUAGE MultiParamTypeClasses #-}
7{-# LANGUAGE ScopedTypeVariables #-}
8{-# LANGUAGE TypeFamilies #-}
9{-# LANGUAGE TypeOperators #-}
10module Data.Primitive.ByteArray.Util where
11
12import GHC.TypeLits
13import Control.Monad.Primitive
14import Data.Primitive.Types
15import Data.Primitive.ByteArray
16
17newtype Offset (n :: Nat) = Offset Int
18
19offset :: KnownNat n => Offset n
20offset = let k = Offset $ fromIntegral $ natVal k in k
21
22(+.) :: Offset j -> Offset k -> Offset (j + k)
23Offset j +. Offset k = Offset (j + k)
24
25
26type family SizeOf a :: Nat
27
28class IsMultipleOf (n::Nat) (k::Nat)
29
30instance n ~ (q * k) => IsMultipleOf n k
31
32writeAtByte :: ( Prim a
33 , PrimMonad m
34 , IsMultipleOf n (SizeOf a)
35 ) => MutableByteArray (PrimState m) -> Offset n -> a -> m ()
36writeAtByte buf (Offset offset) a = writeByteArray buf (div offset $ (sizeOf a)) a
37{-# INLINE writeAtByte #-}
38
39readAtByte :: forall a m n.
40 ( Prim a
41 , PrimMonad m
42 , IsMultipleOf n (SizeOf a)
43 ) => MutableByteArray (PrimState m) -> Offset n -> m a
44readAtByte buf (Offset offset) = readByteArray buf (div offset $ (sizeOf (undefined :: a)))
45{-# INLINE readAtByte #-}