#ifdef LANGUAGE_Trustworthy
#endif
module Data.Tuple.ByteArray
( ByteArrayTuple
) where
import Control.Applicative
import Control.Monad.Prim
import Data.ByteArraySlice.Unsafe
import Data.Prim.ByteArray
import Data.Tuple.ITuple
import Data.Tuple.ITuple.Proxy
import Data.Tuple.MTuple
import Data.Typeable (Typeable)
newtype ByteArrayTuple s a = ByteArrayTuple (MutableByteArray s) deriving (Eq, Typeable)
instance ( MonadPrim m
, s ~ World m
, ITuple t
, ByteArraySlice (Tuple (ListRep t))
) => MTuple (ByteArrayTuple s) t m where
thawTuple a = runPrim $ do
array <- newByteArray (byteSizeOf' a)
writeByteOff array 0 (toTuple a)
return $ ByteArrayTuple array
freezeTuple (ByteArrayTuple array) =
runPrim $ fromTuple <$> readByteOff array 0
instance ( MonadPrim m
, s ~ World m
, ITuple t
, ByteArraySlice (Tuple (ListRep t))
, ByteArraySlice (Field1 t)
) => MField1 (ByteArrayTuple s) t m where
read1 = unsafeRead offset1
write1 = unsafeWrite offset1
instance ( MonadPrim m
, s ~ World m
, ITuple t
, ByteArraySlice (Tuple (ListRep t))
, ByteArraySlice (Field1 t)
, ByteArraySlice (Field2 t)
) => MField2 (ByteArrayTuple s) t m where
read2 = unsafeRead offset2
write2 = unsafeWrite offset2
instance ( MonadPrim m
, s ~ World m
, ITuple t
, ByteArraySlice (Tuple (ListRep t))
, ByteArraySlice (Field1 t)
, ByteArraySlice (Field2 t)
, ByteArraySlice (Field3 t)
) => MField3 (ByteArrayTuple s) t m where
read3 = unsafeRead offset3
write3 = unsafeWrite offset3
instance ( MonadPrim m
, s ~ World m
, ITuple t
, ByteArraySlice (Tuple (ListRep t))
, ByteArraySlice (Field1 t)
, ByteArraySlice (Field2 t)
, ByteArraySlice (Field3 t)
, ByteArraySlice (Field4 t)
) => MField4 (ByteArrayTuple s) t m where
read4 = unsafeRead offset4
write4 = unsafeWrite offset4
instance ( MonadPrim m
, s ~ World m
, ITuple t
, ByteArraySlice (Tuple (ListRep t))
, ByteArraySlice (Field1 t)
, ByteArraySlice (Field2 t)
, ByteArraySlice (Field3 t)
, ByteArraySlice (Field4 t)
, ByteArraySlice (Field5 t)
) => MField5 (ByteArrayTuple s) t m where
read5 = unsafeRead offset5
write5 = unsafeWrite offset5
instance ( MonadPrim m
, s ~ World m
, ITuple t
, ByteArraySlice (Tuple (ListRep t))
, ByteArraySlice (Field1 t)
, ByteArraySlice (Field2 t)
, ByteArraySlice (Field3 t)
, ByteArraySlice (Field4 t)
, ByteArraySlice (Field5 t)
, ByteArraySlice (Field6 t)
) => MField6 (ByteArrayTuple s) t m where
read6 = unsafeRead offset6
write6 = unsafeWrite offset6
instance ( MonadPrim m
, s ~ World m
, ITuple t
, ByteArraySlice (Tuple (ListRep t))
, ByteArraySlice (Field1 t)
, ByteArraySlice (Field2 t)
, ByteArraySlice (Field3 t)
, ByteArraySlice (Field4 t)
, ByteArraySlice (Field5 t)
, ByteArraySlice (Field6 t)
, ByteArraySlice (Field7 t)
) => MField7 (ByteArrayTuple s) t m where
read7 = unsafeRead offset7
write7 = unsafeWrite offset7
instance ( MonadPrim m
, s ~ World m
, ITuple t
, ByteArraySlice (Tuple (ListRep t))
, ByteArraySlice (Field1 t)
, ByteArraySlice (Field2 t)
, ByteArraySlice (Field3 t)
, ByteArraySlice (Field4 t)
, ByteArraySlice (Field5 t)
, ByteArraySlice (Field6 t)
, ByteArraySlice (Field7 t)
, ByteArraySlice (Field8 t)
) => MField8 (ByteArrayTuple s) t m where
read8 = unsafeRead offset8
write8 = unsafeWrite offset8
instance ( MonadPrim m
, s ~ World m
, ITuple t
, ByteArraySlice (Tuple (ListRep t))
, ByteArraySlice (Field1 t)
, ByteArraySlice (Field2 t)
, ByteArraySlice (Field3 t)
, ByteArraySlice (Field4 t)
, ByteArraySlice (Field5 t)
, ByteArraySlice (Field6 t)
, ByteArraySlice (Field7 t)
, ByteArraySlice (Field8 t)
, ByteArraySlice (Field9 t)
) => MField9 (ByteArrayTuple s) t m where
read9 = unsafeRead offset9
write9 = unsafeWrite offset9
byteSizeOf' :: (ITuple t, ByteArraySlice (Tuple (ListRep t))) => t -> Int
byteSizeOf' = plusByteSize 0 . proxyTuple
unsafeRead :: ( ByteArraySlice a
, MonadPrim m
) => (forall f . f t -> Int) -> ByteArrayTuple (World m) t -> m a
unsafeRead offset t@(ByteArrayTuple array) =
runPrim $ readByteOff array (offset t)
unsafeWrite :: ( ByteArraySlice a
, MonadPrim m
) => (forall f . f t -> Int) -> ByteArrayTuple (World m) t -> a -> m ()
unsafeWrite offset t@(ByteArrayTuple array) a =
runPrim $ writeByteOff array (offset t) a
offset1 :: t a -> Int
offset1 _ = 0
offset2 :: ByteArraySlice (Field1 a) => t a -> Int
offset2 a = plusByteSize (offset1 a) (reproxyField1 a)
offset3 :: ( ByteArraySlice (Field1 a)
, ByteArraySlice (Field2 a)
) => t a -> Int
offset3 a = plusByteSize (offset2 a) (reproxyField2 a)
offset4 :: ( ByteArraySlice (Field1 a)
, ByteArraySlice (Field2 a)
, ByteArraySlice (Field3 a)
) => t a -> Int
offset4 a = plusByteSize (offset3 a) (reproxyField3 a)
offset5 :: ( ByteArraySlice (Field1 a)
, ByteArraySlice (Field2 a)
, ByteArraySlice (Field3 a)
, ByteArraySlice (Field4 a)
) => t a -> Int
offset5 a = plusByteSize (offset4 a) (reproxyField4 a)
offset6 :: ( ByteArraySlice (Field1 a)
, ByteArraySlice (Field2 a)
, ByteArraySlice (Field3 a)
, ByteArraySlice (Field4 a)
, ByteArraySlice (Field5 a)
) => t a -> Int
offset6 a = plusByteSize (offset5 a) (reproxyField5 a)
offset7 :: ( ByteArraySlice (Field1 a)
, ByteArraySlice (Field2 a)
, ByteArraySlice (Field3 a)
, ByteArraySlice (Field4 a)
, ByteArraySlice (Field5 a)
, ByteArraySlice (Field6 a)
) => t a -> Int
offset7 a = plusByteSize (offset6 a) (reproxyField6 a)
offset8 :: ( ByteArraySlice (Field1 a)
, ByteArraySlice (Field2 a)
, ByteArraySlice (Field3 a)
, ByteArraySlice (Field4 a)
, ByteArraySlice (Field5 a)
, ByteArraySlice (Field6 a)
, ByteArraySlice (Field7 a)
) => t a -> Int
offset8 a = plusByteSize (offset7 a) (reproxyField7 a)
offset9 :: ( ByteArraySlice (Field1 a)
, ByteArraySlice (Field2 a)
, ByteArraySlice (Field3 a)
, ByteArraySlice (Field4 a)
, ByteArraySlice (Field5 a)
, ByteArraySlice (Field6 a)
, ByteArraySlice (Field7 a)
, ByteArraySlice (Field8 a)
) => t a -> Int
offset9 a = plusByteSize (offset8 a) (reproxyField8 a)