on master help sign in
Move independent serialization routines into Serialize.TH.Common
commit8f3f3f7843c43ffeca31889a0ebdbc50daef34a5 authorAdithya Kumar <adithya@composewell.com> dateTue 12 Sep 2023, 20:22 (3 years ago) parentf8e6270
3 files changed+73−45
core/src/Streamly/Internal/Data/Serialize/TH.hs+2−45 core/src/Streamly/Internal/Data/Serialize/TH/Common.hs+70 core/streamly-core.cabal+1
core/src/Streamly/Internal/Data/Serialize/TH.hs+2−45
@@ -33,7 +33,9 @@ import Streamly.Internal.Data.Unbox.TH
3333 , plainInstanceD
3434 , reifyDataType
3535 )
36+
3637import Streamly.Internal.Data.Serialize.TH.Bottom
38+import Streamly.Internal.Data.Serialize.TH.Common
3739
3840--------------------------------------------------------------------------------
3941-- Domain specific helpers
@@ -158,35 +160,6 @@ mkSizeDec (Config {..}) headTy cons = do
158160-- Peek
159161--------------------------------------------------------------------------------
160162
161−mkDeserializeExprOne :: SimpleDataCon -> Q Exp
162−mkDeserializeExprOne (SimpleDataCon cname fields) =
163− case fields of
164− -- Only tag is serialized for unit fields, no actual value
165− [] -> [|pure ($(varE (mkName "i0")), $(conE cname))|]
166− _ ->
167− doE
168− (concat
169− [ fmap makeBind [0 .. (numFields - 1)]
170− , [ noBindS
171− (appE
172− (varE 'pure)
173− (tupE
174− [ varE (makeI numFields)
175− , appsE
176− (conE cname :
177− (map (varE . makeA)
178− [0 .. (numFields - 1)]))
179− ]))
180− ]
181− ])
182− where
183− numFields = length fields
184− makeBind i =
185− bindS
186− (tupP [varP (makeI (i + 1)), varP (makeA i)])
187− [|deserialize $(varE (makeI i)) $(varE _arr) $(varE _endOffset)|]
188−
189−
190163mkDeserializeExpr :: Bool -> Type -> TypeOfType -> Q Exp
191164mkDeserializeExpr True headTy tyOfTy =
192165 case tyOfTy of
@@ -286,22 +259,6 @@ mkSerializeExprTag tagType tagVal =
286259 $(varE _arr)
287260 $((sigE (litE (IntegerL (fromIntegral tagVal))) (conT tagType)))|]
288261
289−mkSerializeExprFields :: [Field] -> Q Exp
290−mkSerializeExprFields fields =
291− case fields of
292− -- Unit constructor, do nothing just tag is enough
293− [] -> [|pure ($(varE (mkName "i0")))|]
294− _ ->
295− doE
296− (fmap makeBind [0 .. (numFields - 1)] ++
297− [noBindS ([|pure $(varE (makeI numFields))|])])
298− where
299− numFields = length fields
300− makeBind i =
301− bindS
302− (varP (makeI (i + 1)))
303− [|serialize $(varE (makeI i)) $(varE _arr) $(varE (mkFieldName i))|]
304−
305262mkSerializeExpr :: Bool -> TypeOfType -> Q Exp
306263mkSerializeExpr True tyOfTy =
307264 case tyOfTy of
core/src/Streamly/Internal/Data/Serialize/TH/Common.hsnew file+70
@@ -0,0 +1,70 @@
1+{-# LANGUAGE TemplateHaskell #-}
2+
3+-- |
4+-- Module : Streamly.Internal.Data.Serialize.TH.Common
5+-- Copyright : (c) 2023 Composewell Technologies
6+-- License : BSD3-3-Clause
7+-- Maintainer : streamly@composewell.com
8+-- Stability : experimental
9+-- Portability : GHC
10+--
11+module Streamly.Internal.Data.Serialize.TH.Common
12+ ( mkDeserializeExprOne
13+ , mkSerializeExprFields
14+ ) where
15+
16+--------------------------------------------------------------------------------
17+-- Imports
18+--------------------------------------------------------------------------------
19+
20+import Language.Haskell.TH
21+import Streamly.Internal.Data.Serialize.Type
22+import Streamly.Internal.Data.Serialize.TH.Bottom
23+
24+--------------------------------------------------------------------------------
25+-- Code
26+--------------------------------------------------------------------------------
27+
28+mkDeserializeExprOne :: SimpleDataCon -> Q Exp
29+mkDeserializeExprOne (SimpleDataCon cname fields) =
30+ case fields of
31+ -- Only tag is serialized for unit fields, no actual value
32+ [] -> [|pure ($(varE (mkName "i0")), $(conE cname))|]
33+ _ ->
34+ doE
35+ (concat
36+ [ fmap makeBind [0 .. (numFields - 1)]
37+ , [ noBindS
38+ (appE
39+ (varE 'pure)
40+ (tupE
41+ [ varE (makeI numFields)
42+ , appsE
43+ (conE cname :
44+ (map (varE . makeA)
45+ [0 .. (numFields - 1)]))
46+ ]))
47+ ]
48+ ])
49+ where
50+ numFields = length fields
51+ makeBind i =
52+ bindS
53+ (tupP [varP (makeI (i + 1)), varP (makeA i)])
54+ [|deserialize $(varE (makeI i)) $(varE _arr) $(varE _endOffset)|]
55+
56+mkSerializeExprFields :: [Field] -> Q Exp
57+mkSerializeExprFields fields =
58+ case fields of
59+ -- Unit constructor, do nothing just tag is enough
60+ [] -> [|pure ($(varE (mkName "i0")))|]
61+ _ ->
62+ doE
63+ (fmap makeBind [0 .. (numFields - 1)] ++
64+ [noBindS ([|pure $(varE (makeI numFields))|])])
65+ where
66+ numFields = length fields
67+ makeBind i =
68+ bindS
69+ (varP (makeI (i + 1)))
70+ [|serialize $(varE (makeI i)) $(varE _arr) $(varE (mkFieldName i))|]
core/streamly-core.cabal+1
@@ -289,6 +289,7 @@ library
289289 , Streamly.Internal.Data.Serialize
290290 , Streamly.Internal.Data.Unbox.TH
291291 , Streamly.Internal.Data.Serialize.TH
292+ , Streamly.Internal.Data.Serialize.TH.Common
292293 , Streamly.Internal.Data.Serialize.TH.Bottom
293294
294295 -- Unboxed IORef