on master help sign in
Export more functionality via Streamly.Data.Serialize
commit83d25db1921b3a9f019dddddb873a3b77e2cc242 authorAdithya Kumar <adithya@composewell.com> dateThu 3 Aug 2023, 15:25 (3 years ago) parent8aee462
2 files changed+83−3
core/src/Streamly/Data/Serialize.hs+75−3 core/src/Streamly/Internal/Data/Serialize.hs+8
core/src/Streamly/Data/Serialize.hs+75−3
@@ -6,11 +6,83 @@
66-- Portability : GHC
77--
88module Streamly.Data.Serialize
9− ( Unbox(..)
10− , MutableByteArray
9+ (
10+
11+ -- * Types
12+ MutableByteArray
13+
14+ -- * Unbox
15+ , Unbox(..)
1116 , deriveUnbox
1217 , deriveUnboxWith
18+
19+ -- * Serialize
20+ , Size(..)
21+ , Serialize(..)
22+ , deriveSerialize
23+ , deriveSerializeWith
24+
25+ -- * Encoding
26+ , encode
27+ , pinnedEncode
28+
29+ -- * Decoding
30+ , decode
1331 ) where
1432
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+ )
1542import Streamly.Internal.Data.Unbox
16−import Streamly.Internal.Data.Unbox.TH
43+ ( MutableByteArray
44+ , PinnedState(..)
45+ , Unbox(..)
46+ )
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+
19module Streamly.Internal.Data.Serialize
210 ( Size(..)
311 , Serialize(..)