Skip to content

Commit 3300b67

Browse files
committed
Add encodeRecord
1 parent f9fb69a commit 3300b67

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

src/Data/Argonaut/Encode/Class.purs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,13 @@ import Data.Maybe (Maybe(..))
1111
import Data.String (CodePoint)
1212
import Data.String.CodePoints as CP
1313
import Data.String.CodeUnits as CU
14+
import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol)
1415
import Data.Tuple (Tuple(..))
1516
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(..))
1621

1722
class EncodeJson a where
1823
encodeJson :: a -> Json
@@ -70,3 +75,31 @@ instance encodeMap :: (Ord a, EncodeJson a, EncodeJson b) => EncodeJson (M.Map a
7075

7176
instance 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

Comments
 (0)