diff options
Diffstat (limited to 'haskell/Data/Primitive/ByteArray/Util.hs')
-rw-r--r-- | haskell/Data/Primitive/ByteArray/Util.hs | 45 |
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 #-} | ||
10 | module Data.Primitive.ByteArray.Util where | ||
11 | |||
12 | import GHC.TypeLits | ||
13 | import Control.Monad.Primitive | ||
14 | import Data.Primitive.Types | ||
15 | import Data.Primitive.ByteArray | ||
16 | |||
17 | newtype Offset (n :: Nat) = Offset Int | ||
18 | |||
19 | offset :: KnownNat n => Offset n | ||
20 | offset = let k = Offset $ fromIntegral $ natVal k in k | ||
21 | |||
22 | (+.) :: Offset j -> Offset k -> Offset (j + k) | ||
23 | Offset j +. Offset k = Offset (j + k) | ||
24 | |||
25 | |||
26 | type family SizeOf a :: Nat | ||
27 | |||
28 | class IsMultipleOf (n::Nat) (k::Nat) | ||
29 | |||
30 | instance n ~ (q * k) => IsMultipleOf n k | ||
31 | |||
32 | writeAtByte :: ( Prim a | ||
33 | , PrimMonad m | ||
34 | , IsMultipleOf n (SizeOf a) | ||
35 | ) => MutableByteArray (PrimState m) -> Offset n -> a -> m () | ||
36 | writeAtByte buf (Offset offset) a = writeByteArray buf (div offset $ (sizeOf a)) a | ||
37 | {-# INLINE writeAtByte #-} | ||
38 | |||
39 | readAtByte :: forall a m n. | ||
40 | ( Prim a | ||
41 | , PrimMonad m | ||
42 | , IsMultipleOf n (SizeOf a) | ||
43 | ) => MutableByteArray (PrimState m) -> Offset n -> m a | ||
44 | readAtByte buf (Offset offset) = readByteArray buf (div offset $ (sizeOf (undefined :: a))) | ||
45 | {-# INLINE readAtByte #-} | ||