@@ -11,8 +11,13 @@ import Data.Maybe (Maybe(..))
11
11
import Data.String (CodePoint )
12
12
import Data.String.CodePoints as CP
13
13
import Data.String.CodeUnits as CU
14
+ import Data.Symbol (class IsSymbol , SProxy (..), reflectSymbol )
14
15
import Data.Tuple (Tuple (..))
15
16
import Foreign.Object as FO
17
+ import Prim.Row as Row
18
+ import Prim.RowList as RL
19
+ import Record as Record
20
+ import Type.Data.RowList (RLProxy (..))
16
21
17
22
class EncodeJson a where
18
23
encodeJson :: a -> Json
@@ -70,3 +75,31 @@ instance encodeMap :: (Ord a, EncodeJson a, EncodeJson b) => EncodeJson (M.Map a
70
75
71
76
instance encodeVoid :: EncodeJson Void where
72
77
encodeJson = absurd
78
+
79
+ instance encodeRecord :: (GEncodeJson row list , RL.RowToList row list ) => EncodeJson (Record row ) where
80
+ encodeJson rec = fromObject $ gEncodeJson rec (RLProxy :: RLProxy list )
81
+
82
+
83
+ class GEncodeJson (row :: # Type ) (list :: RL.RowList ) where
84
+ gEncodeJson :: Record row -> RLProxy list -> FO.Object Json
85
+
86
+ instance gEncodeJsonNil :: GEncodeJson row RL.Nil where
87
+ gEncodeJson _ _ = FO .empty
88
+
89
+ instance gEncodeJsonCons
90
+ :: ( EncodeJson value
91
+ , GEncodeJson row tail
92
+ , IsSymbol field
93
+ , Row.Cons field value tail' row
94
+ )
95
+ => GEncodeJson row (RL.Cons field value tail ) where
96
+
97
+ gEncodeJson row _ =
98
+ let
99
+ sProxy :: SProxy field
100
+ sProxy = SProxy
101
+ in
102
+ FO .insert
103
+ (reflectSymbol sProxy)
104
+ (encodeJson $ Record .get sProxy row)
105
+ (gEncodeJson row $ RLProxy :: RLProxy tail )
0 commit comments