3 | module Language.JSON.Interfaces
5 | import Data.SortedMap
7 | import Language.JSON.Lexer
8 | import Language.JSON.Parser
10 | import Language.JSON
27 | interface ToJSON a where
46 | interface FromJSON a where
47 | fromJSON : JSON -> Maybe a
58 | ToJSON Integer where
59 | toJSON = JNumber . cast
64 | FromJSON Integer where
65 | fromJSON (JNumber x) = pure (cast x)
66 | fromJSON _ = neutral
70 | toJSON = JNumber . cast
74 | fromJSON (JNumber x) = pure (cast x)
75 | fromJSON _ = neutral
79 | toJSON = JNumber . cast . cast {to = Int}
82 | FromJSON Bits8 where
83 | fromJSON (JNumber x) = pure (fromInteger $
cast x)
84 | fromJSON _ = neutral
88 | toJSON = JNumber . cast . cast {to = Int}
91 | FromJSON Bits16 where
92 | fromJSON (JNumber x) = pure (fromInteger $
cast x)
93 | fromJSON _ = neutral
97 | toJSON = JNumber . cast . cast {to = Int}
100 | FromJSON Bits32 where
101 | fromJSON (JNumber x) = pure (fromInteger $
cast x)
102 | fromJSON _ = neutral
105 | ToJSON Bits64 where
106 | toJSON = JNumber . cast . cast {to = Int}
109 | FromJSON Bits64 where
110 | fromJSON (JNumber x) = pure (fromInteger $
cast x)
111 | fromJSON _ = neutral
114 | ToJSON Double where
118 | FromJSON Double where
119 | fromJSON (JNumber x) = pure x
120 | fromJSON _ = neutral
124 | toJSON = JNumber . cast
128 | fromJSON (JNumber x) = pure (fromInteger $
cast x)
129 | fromJSON _ = neutral
132 | ToJSON String where
136 | FromJSON String where
137 | fromJSON (JString s) = pure s
138 | fromJSON _ = neutral
142 | toJSON = toJSON . String.singleton
145 | FromJSON Char where
146 | fromJSON (JString s) = case strM s of
147 | StrCons c "" => pure c
149 | fromJSON _ = neutral
156 | FromJSON Bool where
157 | fromJSON (JBoolean b) = pure b
158 | fromJSON _ = neutral
161 | ToJSON a => ToJSON (Maybe a) where
162 | toJSON Nothing = JNull
163 | toJSON (Just x) = toJSON x
166 | FromJSON a => FromJSON (Maybe a) where
167 | fromJSON JNull = pure Nothing
168 | fromJSON json @{impl} = pure <$> fromJSON @{impl} json
171 | ToJSON a => ToJSON (List a) where
172 | toJSON = JArray . map toJSON
175 | FromJSON a => FromJSON (List a) where
176 | fromJSON (JArray xs) = traverse fromJSON xs
177 | fromJSON _ = neutral
181 | toJSON () = JObject empty
185 | fromJSON (JObject xs) = guard $
null xs
186 | fromJSON _ = neutral
189 | (ToJSON a, ToJSON b) => ToJSON (a, b) where
190 | toJSON (x, y) = JArray [toJSON x, toJSON y]
193 | (FromJSON a, FromJSON b) => FromJSON (a, b) where
194 | fromJSON (JArray [x, y]) = (,) <$> fromJSON x <*> fromJSON y
195 | fromJSON _ = neutral
198 | ToJSON v => ToJSON (SortedMap String v) where
199 | toJSON m = JObject (toList $
toJSON <$> m)
202 | FromJSON v => FromJSON (SortedMap String v) where
203 | fromJSON (JObject xs) = fromList <$> traverse (\(k, v) => (k,) <$> fromJSON v) xs
204 | fromJSON _ = neutral
207 | ToJSON a => ToJSON (Inf a) where
208 | toJSON x = toJSON x
211 | FromJSON a => FromJSON (Inf a) where
212 | fromJSON @{impl} x = map (\x => Delay x) (fromJSON @{impl} x)