on master help sign in
Export more functionality via Streamly.Data.Serialize
83d25dbAdithya Kumar
core/src/Streamly/Data/Serialize.hs+75−3
@@ -6,11 +6,83 @@
6-- Portability : GHC
6-- Portability : GHC
7--
7--
8module Streamly.Data.Serialize
8module Streamly.Data.Serialize
9+ (
10+
11+ -- * Types
12+ MutableByteArray
13+
14+ -- * Unbox
9− ( Unbox(..)
15+ , Unbox(..)
10− , MutableByteArray
11 , deriveUnbox
16 , deriveUnbox
12 , deriveUnboxWith
17 , deriveUnboxWith
18+
19+ -- * Serialize
20+ , Size(..)
21+ , Serialize(..)
22+ , deriveSerialize
23+ , deriveSerializeWith
24+
25+ -- * Encoding
26+ , encode
27+ , pinnedEncode
28+
29+ -- * Decoding
30+ , decode
13 ) where
31 ) where
14
32
33+#include "assert.hs"
34+
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
39+ ( deriveSerialize
40+ , deriveSerializeWith
41+ )
15import Streamly.Internal.Data.Unbox
42import Streamly.Internal.Data.Unbox
43+ ( MutableByteArray
44+ , PinnedState(..)
45+ , Unbox(..)
46+ )
16−import Streamly.Internal.Data.Unbox.TH
47+import Streamly.Internal.Data.Unbox.TH (deriveUnbox, deriveUnboxWith)
48+import Streamly.Internal.System.IO (unsafeInlineIO)
49+
50+import qualified Streamly.Internal.Data.Unbox as Unbox
51+import qualified Streamly.Internal.Data.Array as Array
52+
53+--------------------------------------------------------------------------------
54+-- Serialize
55+--------------------------------------------------------------------------------
56+
57+{-# INLINE encodeAs #-}
58+encodeAs :: forall a. Serialize a => PinnedState -> a -> Array Word8
59+encodeAs ps a =
60+ unsafeInlineIO $ do
61+ let len =
62+ case size :: Size a of
63+ ConstSize sz -> sz
64+ VarSize f -> f a
65+ mbarr <- Unbox.newBytesAs ps len
66+ nextOff <- serialize 0 mbarr a
67+ assertM(nextOff == len)
68+ pure $ Array mbarr 0 len
69+
70+{-# INLINE encode #-}
71+encode :: Serialize a => a -> Array Word8
72+encode = encodeAs Unpinned
73+
74+{-# INLINE pinnedEncode #-}
75+pinnedEncode :: Serialize a => a -> Array Word8
76+pinnedEncode = encodeAs Pinned
77+
78+--------------------------------------------------------------------------------
79+-- Deserialize
80+--------------------------------------------------------------------------------
81+
82+{-# INLINE decode #-}
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)
88+ pure val
core/src/Streamly/Internal/Data/Serialize.hs+8
@@ -1,3 +1,11 @@
1+-- |
2+-- Module : Streamly.Internal.Data.Serialize
3+-- Copyright : (c) 2023 Composewell Technologies
4+-- License : BSD3-3-Clause
5+-- Maintainer : streamly@composewell.com
6+-- Portability : GHC
7+--
8+
1module Streamly.Internal.Data.Serialize
9module Streamly.Internal.Data.Serialize
2 ( Size(..)
10 ( Size(..)
3 , Serialize(..)
11 , Serialize(..)