@@ -6,11 +6,83 @@
6-- Portability : GHC
6-- Portability : GHC
8module Streamly.Data.Serialize
8module Streamly.Data.Serialize
9− ( Unbox(..)
15+ , Unbox(..)
11 , deriveUnbox
16 , deriveUnbox
12 , deriveUnboxWith
17 , deriveUnboxWith
23+ , deriveSerializeWith
35+import Data.Word (Word8)
36+import Streamly.Internal.Data.Array.Type (Array(..))
37+import Streamly.Internal.Data.Serialize (Serialize(..), Size(..))
38+import Streamly.Internal.Data.Serialize.TH
40+ , deriveSerializeWith
15import Streamly.Internal.Data.Unbox
42import Streamly.Internal.Data.Unbox
16−import Streamly.Internal.Data.Unbox.TH
47+import Streamly.Internal.Data.Unbox.TH (deriveUnbox, deriveUnboxWith)
48+import Streamly.Internal.System.IO (unsafeInlineIO)
50+import qualified Streamly.Internal.Data.Unbox as Unbox
51+import qualified Streamly.Internal.Data.Array as Array
53+--------------------------------------------------------------------------------
55+--------------------------------------------------------------------------------
57+{-# INLINE encodeAs #-}
58+encodeAs :: forall a. Serialize a => PinnedState -> a -> Array Word8
62+ case size :: Size a of
65+ mbarr <- Unbox.newBytesAs ps len
66+ nextOff <- serialize 0 mbarr a
67+ assertM(nextOff == len)
68+ pure $ Array mbarr 0 len
71+encode :: Serialize a => a -> Array Word8
72+encode = encodeAs Unpinned
74+{-# INLINE pinnedEncode #-}
75+pinnedEncode :: Serialize a => a -> Array Word8
76+pinnedEncode = encodeAs Pinned
78+--------------------------------------------------------------------------------
80+--------------------------------------------------------------------------------
83+decode :: Serialize a => Array Word8 -> a
84+decode arr@(Array {..}) = unsafeInlineIO $ do
85+ let len = Array.length arr
86+ (nextOff, val) <- deserialize 0 arrContents
87+ assertM(nextOff == len)