Skip to content

Commit 7b75ab7

Browse files
Add documentation for monoidmap-aeson. (#246)
2 parents 36793c8 + 1e2a7ad commit 7b75ab7

File tree

2 files changed

+77
-5
lines changed

2 files changed

+77
-5
lines changed

components/monoidmap-aeson/Data/MonoidMap/JSON.hs

Lines changed: 76 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,53 @@
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

955
import 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
)
1770
import Data.Monoid.Null
1871
( MonoidNull
1972
)
2073
import 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

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

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

monoidmap.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ library monoidmap-aeson
9898
import:
9999
, dependency-aeson
100100
, dependency-base
101+
, dependency-containers
101102
, dependency-monoid-subclasses
102103
, extensions
103104
visibility:

0 commit comments

Comments
 (0)