/
Class.purs
67 lines (49 loc) · 2.22 KB
/
Class.purs
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
module Data.Argonaut.Encode.Class where
import Prelude
import Data.Argonaut.Core (Json, fromArray, fromBoolean, fromNumber, fromObject, fromString, jsonNull)
import Data.Either (Either, either)
import Data.Int (toNumber)
import Data.List (List(..), (:), toUnfoldable)
import Data.Map as M
import Data.Maybe (Maybe(..))
import Data.String (singleton)
import Data.StrMap as SM
import Data.Tuple (Tuple(..))
class EncodeJson a where
encodeJson :: a -> Json
instance encodeJsonMaybe :: EncodeJson a => EncodeJson (Maybe a) where
encodeJson Nothing = jsonNull
encodeJson (Just a) = encodeJson a
instance encodeJsonTuple :: (EncodeJson a, EncodeJson b) => EncodeJson (Tuple a b) where
encodeJson (Tuple a b) = encodeJson [encodeJson a, encodeJson b]
instance encodeJsonEither :: (EncodeJson a, EncodeJson b) => EncodeJson (Either a b) where
encodeJson = either (obj "Left") (obj "Right")
where
obj :: forall c. EncodeJson c => String -> c -> Json
obj tag x =
fromObject $ SM.fromFoldable $
Tuple "tag" (fromString tag) : Tuple "value" (encodeJson x) : Nil
instance encodeJsonUnit :: EncodeJson Unit where
encodeJson = const jsonNull
instance encodeJsonJBoolean :: EncodeJson Boolean where
encodeJson = fromBoolean
instance encodeJsonJNumber :: EncodeJson Number where
encodeJson = fromNumber
instance encodeJsonInt :: EncodeJson Int where
encodeJson = fromNumber <<< toNumber
instance encodeJsonJString :: EncodeJson String where
encodeJson = fromString
instance encodeJsonJson :: EncodeJson Json where
encodeJson = id
instance encodeJsonChar :: EncodeJson Char where
encodeJson = encodeJson <<< singleton
instance encodeJsonArray :: EncodeJson a => EncodeJson (Array a) where
encodeJson json = fromArray (encodeJson <$> json)
instance encodeJsonList :: EncodeJson a => EncodeJson (List a) where
encodeJson = fromArray <<< map encodeJson <<< toUnfoldable
instance encodeStrMap :: EncodeJson a => EncodeJson (SM.StrMap a) where
encodeJson = fromObject <<< map encodeJson
instance encodeMap :: (Ord a, EncodeJson a, EncodeJson b) => EncodeJson (M.Map a b) where
encodeJson = encodeJson <<< (M.toUnfoldable :: M.Map a b -> List (Tuple a b))
instance encodeVoid :: EncodeJson Void where
encodeJson = absurd