44-- Copyright: © 2022–2025 Jonathan Knowles
55-- License: Apache-2.0
66--
7- module Data.MonoidMap.JSON where
7+ -- This module provides instances of 'ToJSON' and 'FromJSON' for 'MonoidMap'.
8+ --
9+ -- These instances provide objects of type 'MonoidMap' __@k@__ __@v@__ with a
10+ -- JSON encoding identical to that of 'Map' __@k@__ __@v@__, serialised as
11+ -- either JSON /objects/ or /arrays/ depending on the key type __@k@__.
12+ --
13+ -- = Examples
14+ --
15+ -- === Encoding as JSON objects
16+ --
17+ -- @
18+ -- >>> 'encode' '$' 'fromList' [("abc", 'Sum' 1), ("def", 'Sum' 2)]
19+ -- "{\\"abc\\":1,\\"def\\":2}"
20+ -- @
21+ --
22+ -- === Encoding as JSON arrays
23+ --
24+ -- @
25+ -- >>> 'encode' '$' 'fromList' [((1,2), 'Sum' 3), ((2,3), 'Sum' 5)]
26+ -- "[[[1,2],3],[[2,3],5]]"
27+ -- @
28+ --
29+ -- = Laws
30+ --
31+ -- == Decoding from JSON
32+ --
33+ -- The 'FromJSON' instance satisfies the following law:
34+ --
35+ -- @
36+ -- 'parseJSON' '==' 'fmap' ('fmap' 'MonoidMap'.'fromMap') 'parseJSON'
37+ -- @
38+ --
39+ -- Mappings from keys to values that decode to 'mempty' are __not__ included in
40+ -- decoded 'MonoidMap' objects.
41+ --
42+ -- == Encoding to JSON
43+ --
44+ -- The 'ToJSON' instance satisfies the following laws:
45+ --
46+ -- @
47+ -- 'toEncoding' '==' 'toEncoding' '.' 'MonoidMap'.'toMap'
48+ -- 'toJSON' '==' 'toJSON' '.' 'MonoidMap'.'toMap'
49+ -- @
50+ --
51+ module Data.MonoidMap.JSON
52+ ()
53+ where
854
955import Prelude
1056
@@ -13,24 +59,49 @@ import Data.Aeson
1359 , FromJSONKey
1460 , ToJSON (toEncoding , toJSON )
1561 , ToJSONKey
62+ , encode
63+ )
64+ import Data.Map.Strict
65+ ( Map
66+ )
67+ import Data.Monoid
68+ ( Sum
1669 )
1770import Data.Monoid.Null
1871 ( MonoidNull
1972 )
2073import Data.MonoidMap
2174 ( MonoidMap
75+ , fromList
76+ , fromMap
77+ , toMap
2278 )
2379
24- import qualified Data.MonoidMap as MonoidMap
80+ _importsRequiredForDocumentation :: ()
81+ _importsRequiredForDocumentation = ()
82+ where
83+ _encode = encode ()
84+
85+ _fromList :: (Ord k , MonoidNull v ) => [(k , v )] -> MonoidMap k v
86+ _fromList = fromList
87+
88+ _fromMap :: (Ord k , MonoidNull v ) => Map k v -> MonoidMap k v
89+ _fromMap = fromMap
90+
91+ _toMap :: (Ord k , MonoidNull v ) => MonoidMap k v -> Map k v
92+ _toMap = toMap
93+
94+ _Sum :: Sum ()
95+ _Sum = undefined
2596
2697instance
2798 ( ToJSONKey k
2899 , ToJSON v
29100 )
30101 => ToJSON (MonoidMap k v )
31102 where
32- toEncoding = toEncoding . MonoidMap. toMap
33- toJSON = toJSON . MonoidMap. toMap
103+ toEncoding = toEncoding . toMap
104+ toJSON = toJSON . toMap
34105
35106instance
36107 ( FromJSONKey k
@@ -40,4 +111,4 @@ instance
40111 )
41112 => FromJSON (MonoidMap k v )
42113 where
43- parseJSON = fmap (fmap MonoidMap. fromMap) parseJSON
114+ parseJSON = fmap (fmap fromMap) parseJSON
0 commit comments