@@ -11,8 +11,13 @@ import Data.Maybe (Maybe(..))
1111import Data.String (CodePoint )
1212import Data.String.CodePoints as CP
1313import Data.String.CodeUnits as CU
14+ import Data.Symbol (class IsSymbol , SProxy (..), reflectSymbol )
1415import Data.Tuple (Tuple (..))
1516import 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 (..))
1621
1722class EncodeJson a where
1823 encodeJson :: a -> Json
@@ -70,3 +75,31 @@ instance encodeMap :: (Ord a, EncodeJson a, EncodeJson b) => EncodeJson (M.Map a
7075
7176instance encodeVoid :: EncodeJson Void where
7277 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