forked from purescript-contrib/purescript-argonaut-codecs
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathClass.purs
More file actions
127 lines (96 loc) · 4.07 KB
/
Class.purs
File metadata and controls
127 lines (96 loc) · 4.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
module Data.Argonaut.Encode.Class where
import Data.Argonaut.Encode.Encoders
import Data.Argonaut.Core (Json, fromObject)
import Data.Array.NonEmpty (NonEmptyArray)
import Data.String.NonEmpty (NonEmptyString)
import Data.Const (Const)
import Data.Either (Either)
import Data.Identity (Identity)
import Data.List (List)
import Data.List.Types (NonEmptyList)
import Data.Map as M
import Data.Maybe (Maybe)
import Data.NonEmpty (NonEmpty)
import Data.Set as S
import Data.String (CodePoint)
import Data.Symbol (class IsSymbol, reflectSymbol)
import Data.Tuple (Tuple)
import Foreign.Object as FO
import Prelude (class Ord, Unit, Void, identity, ($))
import Prim.Row as Row
import Prim.RowList as RL
import Record as Record
import Type.Proxy (Proxy(..))
class EncodeJson a where
encodeJson :: a -> Json
instance encodeIdentity :: EncodeJson a => EncodeJson (Identity a) where
encodeJson = encodeIdentity encodeJson
instance encodeConst :: EncodeJson a => EncodeJson (Const a b) where
encodeJson = encodeConst encodeJson
instance encodeJsonMaybe :: EncodeJson a => EncodeJson (Maybe a) where
encodeJson = encodeMaybe encodeJson
instance encodeJsonTuple :: (EncodeJson a, EncodeJson b) => EncodeJson (Tuple a b) where
encodeJson = encodeTuple encodeJson encodeJson
instance encodeJsonEither :: (EncodeJson a, EncodeJson b) => EncodeJson (Either a b) where
encodeJson = encodeEither encodeJson encodeJson
instance encodeJsonUnit :: EncodeJson Unit where
encodeJson = encodeUnit
instance encodeJsonJBoolean :: EncodeJson Boolean where
encodeJson = encodeBoolean
instance encodeJsonJNumber :: EncodeJson Number where
encodeJson = encodeNumber
instance encodeJsonInt :: EncodeJson Int where
encodeJson = encodeInt
instance encodeJsonJString :: EncodeJson String where
encodeJson = encodeString
instance encodeJsonJson :: EncodeJson Json where
encodeJson = identity
instance encodeJsonCodePoint :: EncodeJson CodePoint where
encodeJson = encodeCodePoint
instance encodeNonEmptyString :: EncodeJson NonEmptyString where
encodeJson = encodeNonEmptyString
instance encodeJsonNonEmpty_Array :: (EncodeJson a) => EncodeJson (NonEmpty Array a) where
encodeJson = encodeNonEmpty_Array encodeJson
instance encodeJsonNonEmptyArray :: (EncodeJson a) => EncodeJson (NonEmptyArray a) where
encodeJson = encodeNonEmptyArray encodeJson
instance encodeJsonNonEmpty_List :: (EncodeJson a) => EncodeJson (NonEmpty List a) where
encodeJson = encodeNonEmpty_List encodeJson
instance encodeJsonNonEmptyList :: (EncodeJson a) => EncodeJson (NonEmptyList a) where
encodeJson = encodeNonEmptyList encodeJson
instance encodeJsonChar :: EncodeJson Char where
encodeJson = encodeChar
instance encodeJsonArray :: EncodeJson a => EncodeJson (Array a) where
encodeJson = encodeArray encodeJson
instance encodeJsonList :: EncodeJson a => EncodeJson (List a) where
encodeJson = encodeList encodeJson
instance encodeForeignObject :: EncodeJson a => EncodeJson (FO.Object a) where
encodeJson = encodeForeignObject encodeJson
instance encodeSet :: (Ord a, EncodeJson a) => EncodeJson (S.Set a) where
encodeJson = encodeSet encodeJson
instance encodeMap :: (Ord a, EncodeJson a, EncodeJson b) => EncodeJson (M.Map a b) where
encodeJson = encodeMap encodeJson encodeJson
instance encodeVoid :: EncodeJson Void where
encodeJson = encodeVoid
instance encodeRecord ::
( GEncodeJson row list
, RL.RowToList row list
) =>
EncodeJson (Record row) where
encodeJson rec = fromObject $ gEncodeJson rec (Proxy :: Proxy list)
class GEncodeJson (row :: Row Type) (list :: RL.RowList Type) where
gEncodeJson :: forall proxy. Record row -> proxy list -> FO.Object Json
instance gEncodeJsonNil :: GEncodeJson row RL.Nil where
gEncodeJson _ _ = FO.empty
instance gEncodeJsonCons ::
( EncodeJson value
, GEncodeJson row tail
, IsSymbol field
, Row.Cons field value tail' row
) =>
GEncodeJson row (RL.Cons field value tail) where
gEncodeJson row _ = do
let _field = Proxy :: Proxy field
FO.insert
(reflectSymbol _field)
(encodeJson $ Record.get _field row)
(gEncodeJson row (Proxy :: Proxy tail))