on master help sign in
Merge pull request #458 from bos/pre-1.0.0.0
daba490Adam Bergmark
CONTRIBUTING.mdnew file+46
@@ -0,0 +1,46 @@
1+# Style guide
2+
3+* 4 space indentation
4+
5+## Pragmas
6+
7+* One pragma on each line
8+* No alignment
9+* Sort lexicographically
10+
11+```haskell
12+{-# LANGUAGE BangPatterns #-}
13+{-# LANGUAGE CPP #-}
14+{-# LANGUAGE DataKinds #-}
15+```
16+
17+## Module declaration and exports
18+
19+* Opening paren on its own line
20+* Prefix with commas
21+* End with `) where`
22+
23+```haskell
24+module Data.Aeson.Types.ToJSON
25+ (
26+ -- * Core JSON classes
27+ ToJSON(..)
28+ -- * Liftings to unary and binary type constructors
29+ , ToJSON1(..)
30+ , toJSON1
31+ ) where
32+```
33+
34+## Imports
35+
36+* No alignment of import lists or qualifications
37+* Sort lexicographically (qualified imports will be last)
38+* No space between types and constructor lists
39+* Sort identifiers in import lists lexicographically
40+
41+```haskell
42+import BarBar as B ((<>), foo)
43+import Foo as F
44+import Qux (Q(..), q)
45+import qualified A
46+```
Data/Aeson.hs+2−4
@@ -111,13 +111,11 @@ module Data.Aeson
111 ) where
111 ) where
112
112
113import Prelude ()
113import Prelude ()
114−import Prelude.Compat (Maybe, either, Either(..), uncurry, String, (.))
114+import Prelude.Compat
115
115
116import Data.Aeson.Types.FromJSON (ifromJSON)
116import Data.Aeson.Types.FromJSON (ifromJSON)
117import Data.Aeson.Encoding (encodingToLazyByteString)
117import Data.Aeson.Encoding (encodingToLazyByteString)
118−import Data.Aeson.Parser.Internal (decodeWith, decodeStrictWith,
118+import Data.Aeson.Parser.Internal (decodeWith, decodeStrictWith, eitherDecodeWith, eitherDecodeStrictWith, jsonEOF, json, jsonEOF', json')
119− eitherDecodeWith, eitherDecodeStrictWith,
120− jsonEOF, json, jsonEOF', json')
121import Data.Aeson.Types
119import Data.Aeson.Types
122import Data.Aeson.Types.Internal (JSONPath, formatError)
120import Data.Aeson.Types.Internal (JSONPath, formatError)
123import qualified Data.ByteString as B
121import qualified Data.ByteString as B
Data/Aeson/Encode.hs+4−2
@@ -9,13 +9,15 @@
9--
9--
10-- This module is left to supply limited backwards-compatibility.
10-- This module is left to supply limited backwards-compatibility.
11module Data.Aeson.Encode {-# DEPRECATED "Use Data.Aeson or Data.Aeson.Text instead" #-}
11module Data.Aeson.Encode {-# DEPRECATED "Use Data.Aeson or Data.Aeson.Text instead" #-}
12+ (
12− ( encode
13+ encode
13 , encodeToTextBuilder
14 , encodeToTextBuilder
14 ) where
15 ) where
15
16
17+import Prelude ()
18+
16import Data.ByteString.Lazy (ByteString)
19import Data.ByteString.Lazy (ByteString)
17import Data.Text.Lazy.Builder (Builder)
20import Data.Text.Lazy.Builder (Builder)
18−
19import qualified Data.Aeson as A
21import qualified Data.Aeson as A
20import qualified Data.Aeson.Text as A
22import qualified Data.Aeson.Text as A
21
23
Data/Aeson/Encoding.hs+3−1
@@ -8,7 +8,7 @@ module Data.Aeson.Encoding
8 -- * Encoding
8 -- * Encoding
9 Encoding
9 Encoding
10 , Encoding'
10 , Encoding'
11− , encodingToLazyByteString
11+ , encodingToLazyByteString
12 , fromEncoding
12 , fromEncoding
13 , unsafeToEncoding
13 , unsafeToEncoding
14 , Series
14 , Series
@@ -47,4 +47,6 @@ module Data.Aeson.Encoding
47 , value
47 , value
48 ) where
48 ) where
49
49
50+import Prelude ()
51+
50import Data.Aeson.Encoding.Internal
52import Data.Aeson.Encoding.Internal
Data/Aeson/Encoding/Builder.hs+3−1
@@ -1,4 +1,6 @@
1−{-# LANGUAGE BangPatterns, CPP, OverloadedStrings #-}
1+{-# LANGUAGE BangPatterns #-}
2+{-# LANGUAGE CPP #-}
3+{-# LANGUAGE OverloadedStrings #-}
2
4
3-- |
5-- |
4-- Module: Data.Aeson.Encoding.Builder
6-- Module: Data.Aeson.Encoding.Builder
Data/Aeson/Encoding/Internal.hs+14−17
@@ -1,7 +1,7 @@
1{-# LANGUAGE DeriveDataTypeable #-}
1{-# LANGUAGE DeriveDataTypeable #-}
2−{-# LANGUAGE EmptyDataDecls #-}
2+{-# LANGUAGE EmptyDataDecls #-}
3−{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE OverloadedStrings #-}
4−{-# LANGUAGE RankNTypes #-}
4+{-# LANGUAGE RankNTypes #-}
5module Data.Aeson.Encoding.Internal
5module Data.Aeson.Encoding.Internal
6 (
6 (
7 -- * Encoding
7 -- * Encoding
@@ -53,25 +53,22 @@ module Data.Aeson.Encoding.Internal
53 , comma, colon, openBracket, closeBracket, openCurly, closeCurly
53 , comma, colon, openBracket, closeBracket, openCurly, closeCurly
54 ) where
54 ) where
55
55
56−import Prelude ()
56+import Prelude ()
57import Prelude.Compat
57import Prelude.Compat
58
58
59+import Data.Aeson.Types.Internal (Value)
59−import Data.ByteString.Builder (Builder, char7, toLazyByteString)
60+import Data.ByteString.Builder (Builder, char7, toLazyByteString)
60import Data.Int
61import Data.Int
61−import Data.Scientific (Scientific)
62+import Data.Scientific (Scientific)
62−import Data.Semigroup (Semigroup ((<>)))
63+import Data.Semigroup (Semigroup ((<>)))
63−import Data.Text (Text)
64+import Data.Text (Text)
64−import Data.Time (Day, LocalTime, TimeOfDay, UTCTime,
65+import Data.Time (Day, LocalTime, TimeOfDay, UTCTime, ZonedTime)
65− ZonedTime)
66−import Data.Typeable (Typeable)
66+import Data.Typeable (Typeable)
67import Data.Word
67import Data.Word
68−
69−import Data.Aeson.Types.Internal (Value)
70−
71import qualified Data.Aeson.Encoding.Builder as EB
68import qualified Data.Aeson.Encoding.Builder as EB
72−import qualified Data.ByteString.Builder as B
69+import qualified Data.ByteString.Builder as B
73−import qualified Data.ByteString.Lazy as BSL
70+import qualified Data.ByteString.Lazy as BSL
74−import qualified Data.Text.Lazy as LT
71+import qualified Data.Text.Lazy as LT
75
72
76-- | An encoding of a JSON value.
73-- | An encoding of a JSON value.
77--
74--
Data/Aeson/Internal.hs+2
@@ -22,5 +22,7 @@ module Data.Aeson.Internal
22 , iparse
22 , iparse
23 ) where
23 ) where
24
24
25+import Prelude ()
26+
25import Data.Aeson.Types.Internal
27import Data.Aeson.Types.Internal
26import Data.Aeson.Types.FromJSON (ifromJSON)
28import Data.Aeson.Types.FromJSON (ifromJSON)
Data/Aeson/Internal/Functions.hs+2−1
@@ -8,7 +8,8 @@
8-- Portability: portable
8-- Portability: portable
9
9
10module Data.Aeson.Internal.Functions
10module Data.Aeson.Internal.Functions
11+ (
11− ( mapHashKeyVal
12+ mapHashKeyVal
12 , mapKeyVal
13 , mapKeyVal
13 , mapKey
14 , mapKey
14 ) where
15 ) where
Data/Aeson/Parser.hs+3−3
@@ -46,9 +46,9 @@ module Data.Aeson.Parser
46 , eitherDecodeStrictWith
46 , eitherDecodeStrictWith
47 ) where
47 ) where
48
48
49+import Prelude ()
50+
49−import Data.Aeson.Parser.Internal (decodeStrictWith, decodeWith,
51+import Data.Aeson.Parser.Internal (decodeStrictWith, decodeWith, eitherDecodeStrictWith, eitherDecodeWith, json, json', jstring, value, value')
50− eitherDecodeStrictWith, eitherDecodeWith,
51− json, json', jstring, value, value')
52
52
53-- $lazy
53-- $lazy
54--
54--
Data/Aeson/Parser/Internal.hs+4−3
@@ -1,4 +1,6 @@
1−{-# LANGUAGE BangPatterns, CPP, OverloadedStrings #-}
1+{-# LANGUAGE BangPatterns #-}
2+{-# LANGUAGE CPP #-}
3+{-# LANGUAGE OverloadedStrings #-}
2#if MIN_VERSION_ghc_prim(0,3,1)
4#if MIN_VERSION_ghc_prim(0,3,1)
3{-# LANGUAGE MagicHash #-}
5{-# LANGUAGE MagicHash #-}
4#endif
6#endif
@@ -36,8 +38,7 @@ import Prelude.Compat
36
38
37import Control.Monad.IO.Class (liftIO)
39import Control.Monad.IO.Class (liftIO)
38import Data.Aeson.Types.Internal (IResult(..), JSONPath, Result(..), Value(..))
40import Data.Aeson.Types.Internal (IResult(..), JSONPath, Result(..), Value(..))
39−import Data.Attoparsec.ByteString.Char8 (Parser, char, endOfInput, scientific,
41+import Data.Attoparsec.ByteString.Char8 (Parser, char, endOfInput, scientific, skipSpace, string)
40− skipSpace, string)
41import Data.Bits ((.|.), shiftL)
42import Data.Bits ((.|.), shiftL)
42import Data.ByteString.Internal (ByteString(..))
43import Data.ByteString.Internal (ByteString(..))
43import Data.Char (chr)
44import Data.Char (chr)
Data/Aeson/Parser/Time.hs+3−2
@@ -1,4 +1,5 @@
1−{-# LANGUAGE BangPatterns, ScopedTypeVariables #-}
1+{-# LANGUAGE BangPatterns #-}
2+{-# LANGUAGE ScopedTypeVariables #-}
2
3
3-- |
4-- |
4-- Module: Data.Aeson.Parser.Time
5-- Module: Data.Aeson.Parser.Time
@@ -24,7 +25,7 @@ module Data.Aeson.Parser.Time
24import Prelude ()
25import Prelude ()
25import Prelude.Compat
26import Prelude.Compat
26
27
27−import Control.Monad (when, void)
28+import Control.Monad (void, when)
28import Data.Aeson.Internal.Time (toPico)
29import Data.Aeson.Internal.Time (toPico)
29import Data.Attoparsec.Text as A
30import Data.Attoparsec.Text as A
30import Data.Bits ((.&.))
31import Data.Bits ((.&.))
Data/Aeson/TH.hs+38−58
@@ -86,8 +86,12 @@ $('deriveJSON' 'defaultOptions' ''(,,,))
86-}
86-}
87
87
88module Data.Aeson.TH
88module Data.Aeson.TH
89+ (
89− ( -- * Encoding configuration
90+ -- * Encoding configuration
91+ Options(..)
92+ , SumEncoding(..)
93+ , defaultOptions
90− Options(..), SumEncoding(..), defaultOptions, defaultTaggedObject
94+ , defaultTaggedObject
91
95
92 -- * FromJSON and ToJSON derivation
96 -- * FromJSON and ToJSON derivation
93 , deriveJSON
97 , deriveJSON
@@ -112,71 +116,47 @@ module Data.Aeson.TH
112 , mkLiftParseJSON2
116 , mkLiftParseJSON2
113 ) where
117 ) where
114
118
119+import Prelude ()
120+import Prelude.Compat hiding (exp)
121+
115−import Control.Applicative ( pure, (<$>), (<*>), (<|>) )
122+import Control.Applicative ((<|>))
116−import Data.Aeson ( Object, (.=), (.:)
123+import Data.Aeson (Object, (.=), (.:), FromJSON(..), FromJSON1(..), FromJSON2(..), ToJSON(..), ToJSON1(..), ToJSON2(..))
117− , ToJSON(..), FromJSON(..)
118− , ToJSON1(..), FromJSON1(..)
119− , ToJSON2(..), FromJSON2(..)
120− )
121−import Data.Aeson.Types ( Value(..), Parser
124+import Data.Aeson.Types (Options(..), Parser, SumEncoding(..), Value(..), defaultOptions, defaultTaggedObject)
122− , Options(..)
123− , SumEncoding(..)
124− , defaultOptions
125− , defaultTaggedObject
126− )
127−import Data.Aeson.Types.Internal (Pair, (<?>), JSONPathElement(Key))
125+import Data.Aeson.Types.Internal ((<?>), Pair, JSONPathElement(Key))
128import Data.Aeson.Types.FromJSON (parseOptionalFieldWith)
126import Data.Aeson.Types.FromJSON (parseOptionalFieldWith)
129−import Control.Monad ( fail, liftM2, mapM, return, unless, when )
127+import Control.Monad (liftM2, unless, when)
130−import Data.Bool ( Bool(False, True), otherwise, (&&), not )
131−import Data.Either ( Either(Left, Right) )
132−import Data.Eq ( (==) )
133−import Data.Foldable ( concatMap, foldr' )
128+import Data.Foldable (foldr')
134−import Data.Function ( ($), (.), flip )
129+#if MIN_VERSION_template_haskell(2,8,0) && !MIN_VERSION_template_haskell(2,10,0)
135−import Data.Functor ( fmap )
130+import Data.List (nub)
136−import Data.Int ( Int )
131+#endif
137−import Data.List ( (++), all, any, find, foldl, foldl'
138− , genericLength , intercalate , intersperse, length, map
132+import Data.List (find, foldl', genericLength , intercalate , intersperse, partition, union)
139− , partition, union, zip, zip3
140− )
141−import Data.List.NonEmpty ( NonEmpty((:|)), (<|) )
133+import Data.List.NonEmpty ((<|), NonEmpty((:|)))
142−import Data.Map ( Map )
134+import Data.Map (Map)
143−import Data.Maybe ( Maybe(Nothing, Just), catMaybes, fromMaybe, mapMaybe )
135+import Data.Maybe (catMaybes, fromMaybe, mapMaybe)
144−import Data.Set ( Set )
136+import Data.Set (Set)
145−import Language.Haskell.TH
146#if MIN_VERSION_template_haskell(2,8,0)
137#if MIN_VERSION_template_haskell(2,8,0)
147− hiding ( Arity )
138+import Language.Haskell.TH hiding (Arity)
139+#else
140+import Language.Haskell.TH
148#endif
141#endif
149−import Language.Haskell.TH.Syntax ( VarStrictType )
142+import Language.Haskell.TH.Syntax (VarStrictType)
150−import Prelude ( Enum(..), Eq(..), Integer, Ord(..), String
151− , concat, cycle, drop, elem, error, foldr1, fromIntegral
152− , showChar, showParen, shows, showString, snd, splitAt
153− , take, unzip, zipWith, (-), (||)
154− )
155#if MIN_VERSION_template_haskell(2,7,0) && !(MIN_VERSION_template_haskell(2,8,0))
143#if MIN_VERSION_template_haskell(2,7,0) && !(MIN_VERSION_template_haskell(2,8,0))
156−import Language.Haskell.TH.Lib ( starK )
144+import Language.Haskell.TH.Lib (starK)
157#endif
145#endif
158#if MIN_VERSION_template_haskell(2,8,0) && !(MIN_VERSION_template_haskell(2,10,0))
146#if MIN_VERSION_template_haskell(2,8,0) && !(MIN_VERSION_template_haskell(2,10,0))
159−import Data.List ( nub )
160−import Language.Haskell.TH.Syntax ( mkNameG_tc )
147+import Language.Haskell.TH.Syntax (mkNameG_tc)
161−import Prelude ( uncurry )
162−#endif
163−#if MIN_VERSION_template_haskell(2,11,0)
164−import Prelude ( head )
165#endif
148#endif
166−import Text.Printf ( printf )
149+import Text.Printf (printf)
167−import Text.Show ( show )
168import qualified Data.Aeson as A
150import qualified Data.Aeson as A
169import qualified Data.Aeson.Encoding.Internal as E
151import qualified Data.Aeson.Encoding.Internal as E
170−import qualified Data.Foldable as F ( all )
152+import qualified Data.Foldable as F (all)
171−import qualified Data.HashMap.Strict as H ( lookup, toList )
153+import qualified Data.HashMap.Strict as H (lookup, toList)
172−import qualified Data.List.NonEmpty as NE ( drop, length, reverse, splitAt )
154+import qualified Data.List.NonEmpty as NE (drop, length, reverse, splitAt)
173−import qualified Data.Map as M ( fromList, findWithDefault, keys, lookup
155+import qualified Data.Map as M (fromList, findWithDefault, keys, lookup , singleton, size)
174− , singleton, size
175− )
176−import qualified Data.Set as Set ( empty, insert, member )
156+import qualified Data.Set as Set (empty, insert, member)
177−import qualified Data.Text as T ( Text, pack, unpack )
157+import qualified Data.Text as T (Text, pack, unpack)
178−import qualified Data.Vector as V ( unsafeIndex, null, length, create, fromList )
158+import qualified Data.Vector as V (unsafeIndex, null, length, create, fromList)
179−import qualified Data.Vector.Mutable as VM ( unsafeNew, unsafeWrite )
159+import qualified Data.Vector.Mutable as VM (unsafeNew, unsafeWrite)
180
160
181
161
182--------------------------------------------------------------------------------
162--------------------------------------------------------------------------------
Data/Aeson/Text.hs+8−4
@@ -1,4 +1,5 @@
1−{-# LANGUAGE BangPatterns, OverloadedStrings #-}
1+{-# LANGUAGE BangPatterns #-}
2+{-# LANGUAGE OverloadedStrings #-}
2-- |
3-- |
3-- Module: Data.Aeson.Text
4-- Module: Data.Aeson.Text
4-- Copyright: (c) 2012-2016 Bryan O'Sullivan
5-- Copyright: (c) 2012-2016 Bryan O'Sullivan
@@ -14,17 +15,20 @@
14-- You can use the conversions to 'Builder's when embedding JSON messages as
15-- You can use the conversions to 'Builder's when embedding JSON messages as
15-- parts of a protocol.
16-- parts of a protocol.
16module Data.Aeson.Text
17module Data.Aeson.Text
18+ (
17− ( encodeToLazyText
19+ encodeToLazyText
18 , encodeToTextBuilder
20 , encodeToTextBuilder
19 ) where
21 ) where
20
22
23+import Prelude ()
24+import Prelude.Compat
25+
21import Data.Aeson.Types (Value(..), ToJSON(..))
26import Data.Aeson.Types (Value(..), ToJSON(..))
22import Data.Aeson.Encoding (encodingToLazyByteString)
27import Data.Aeson.Encoding (encodingToLazyByteString)
23import Data.Monoid ((<>))
28import Data.Monoid ((<>))
24import Data.Scientific (FPFormat(..), Scientific, base10Exponent)
29import Data.Scientific (FPFormat(..), Scientific, base10Exponent)
25import Data.Text.Lazy.Builder
30import Data.Text.Lazy.Builder
26import Data.Text.Lazy.Builder.Scientific (formatScientificBuilder)
31import Data.Text.Lazy.Builder.Scientific (formatScientificBuilder)
27−
28import Numeric (showHex)
32import Numeric (showHex)
29import qualified Data.HashMap.Strict as H
33import qualified Data.HashMap.Strict as H
30import qualified Data.Text as T
34import qualified Data.Text as T
@@ -36,7 +40,7 @@ import qualified Data.Vector as V
36--
40--
37-- /Note:/ uses 'toEncoding'
41-- /Note:/ uses 'toEncoding'
38encodeToLazyText :: ToJSON a => a -> LT.Text
42encodeToLazyText :: ToJSON a => a -> LT.Text
39−encodeToLazyText = LT.decodeUtf8 . encodingToLazyByteString . toEncoding
43+encodeToLazyText = LT.decodeUtf8 . encodingToLazyByteString . toEncoding
40
44
41-- | Encode a JSON 'Value' to a "Data.Text" 'Builder', which can be
45-- | Encode a JSON 'Value' to a "Data.Text" 'Builder', which can be
42-- embedded efficiently in a text-based protocol.
46-- embedded efficiently in a text-based protocol.
Data/Aeson/Types.hs+1−2
@@ -107,10 +107,9 @@ module Data.Aeson.Types
107import Prelude ()
107import Prelude ()
108import Prelude.Compat
108import Prelude.Compat
109
109
110+import Data.Aeson.Encoding (Encoding, unsafeToEncoding, fromEncoding, Series, pairs)
110import Data.Aeson.Types.Class
111import Data.Aeson.Types.Class
111import Data.Aeson.Types.Internal
112import Data.Aeson.Types.Internal
112−import Data.Aeson.Encoding (Encoding, unsafeToEncoding, fromEncoding, Series, pairs)
113−
114import Data.Foldable (toList)
113import Data.Foldable (toList)
115
114
116-- | Encode a 'Foldable' as a JSON array.
115-- | Encode a 'Foldable' as a JSON array.
Data/Aeson/Types/Class.hs+3−1
@@ -83,6 +83,8 @@ module Data.Aeson.Types.Class
83 , typeMismatch
83 , typeMismatch
84 ) where
84 ) where
85
85
86+import Prelude ()
87+
86import Data.Aeson.Types.FromJSON
88import Data.Aeson.Types.FromJSON
87−import Data.Aeson.Types.ToJSON
88import Data.Aeson.Types.Generic (One, Zero)
89import Data.Aeson.Types.Generic (One, Zero)
90+import Data.Aeson.Types.ToJSON
Data/Aeson/Types/FromJSON.hs+68−73
@@ -1,21 +1,21 @@
1−{-# LANGUAGE CPP #-}
1+{-# LANGUAGE CPP #-}
2−{-# LANGUAGE DataKinds #-}
2+{-# LANGUAGE DataKinds #-}
3−{-# LANGUAGE DefaultSignatures #-}
3+{-# LANGUAGE DefaultSignatures #-}
4−{-# LANGUAGE FlexibleContexts #-}
4+{-# LANGUAGE FlexibleContexts #-}
5−{-# LANGUAGE FlexibleInstances #-}
5+{-# LANGUAGE FlexibleInstances #-}
6−{-# LANGUAGE GADTs #-}
6+{-# LANGUAGE GADTs #-}
7{-# LANGUAGE MultiParamTypeClasses #-}
7{-# LANGUAGE MultiParamTypeClasses #-}
8−{-# LANGUAGE NamedFieldPuns #-}
8+{-# LANGUAGE NamedFieldPuns #-}
9−{-# LANGUAGE OverloadedStrings #-}
9+{-# LANGUAGE OverloadedStrings #-}
10−{-# LANGUAGE RecordWildCards #-}
10+{-# LANGUAGE RecordWildCards #-}
11−{-# LANGUAGE ScopedTypeVariables #-}
11+{-# LANGUAGE ScopedTypeVariables #-}
12−{-# LANGUAGE TypeOperators #-}
12+{-# LANGUAGE TypeOperators #-}
13−{-# LANGUAGE TypeSynonymInstances #-}
13+{-# LANGUAGE TypeSynonymInstances #-}
14−{-# LANGUAGE UndecidableInstances #-}
14+{-# LANGUAGE UndecidableInstances #-}
15−{-# LANGUAGE ViewPatterns #-}
15+{-# LANGUAGE ViewPatterns #-}
16
16
17#if __GLASGOW_HASKELL__ >= 706
17#if __GLASGOW_HASKELL__ >= 706
18−{-# LANGUAGE PolyKinds #-}
18+{-# LANGUAGE PolyKinds #-}
19#endif
19#endif
20
20
21#include "overlapping-compat.h"
21#include "overlapping-compat.h"
@@ -23,7 +23,8 @@
23-- TODO: Drop this when we remove support for Data.Attoparsec.Number
23-- TODO: Drop this when we remove support for Data.Attoparsec.Number
24{-# OPTIONS_GHC -fno-warn-deprecations #-}
24{-# OPTIONS_GHC -fno-warn-deprecations #-}
25
25
26−module Data.Aeson.Types.FromJSON (
26+module Data.Aeson.Types.FromJSON
27+ (
27 -- * Core JSON classes
28 -- * Core JSON classes
28 FromJSON(..)
29 FromJSON(..)
29 -- * Liftings to unary and binary type constructors
30 -- * Liftings to unary and binary type constructors
@@ -46,7 +47,7 @@ module Data.Aeson.Types.FromJSON (
46 -- * List functions
47 -- * List functions
47 , listParser
48 , listParser
48
49
49− -- * Inspecting @'Value's@
50+ -- * Inspecting @'Value's@
50 , withObject
51 , withObject
51 , withText
52 , withText
52 , withArray
53 , withArray
@@ -67,68 +68,62 @@ module Data.Aeson.Types.FromJSON (
67 , parseOptionalFieldWith
68 , parseOptionalFieldWith
68 ) where
69 ) where
69
70
70−import Prelude ()
71+import Prelude ()
71−import Prelude.Compat hiding (foldr)
72+import Prelude.Compat
72
73
74+import Control.Applicative ((<|>), Const(..))
75+import Control.Monad ((<=<), zipWithM)
73import Data.Aeson.Internal.Functions (mapKey)
76import Data.Aeson.Internal.Functions (mapKey)
74import Data.Aeson.Types.Generic
77import Data.Aeson.Types.Generic
75import Data.Aeson.Types.Internal
78import Data.Aeson.Types.Internal
76−
79+import Data.Attoparsec.Number (Number(..))
77−import qualified Data.Aeson.Parser.Time as Time
78−import qualified Data.Attoparsec.ByteString.Char8 as A (endOfInput, parseOnly,
79− scientific)
80−
81−import Control.Applicative (Const (..), (<|>))
82−import Control.Monad ((<=<), zipWithM)
83−import Data.Attoparsec.Number (Number (..))
84−import Data.Bits (unsafeShiftR)
80+import Data.Bits (unsafeShiftR)
85−import Data.Fixed (Fixed, HasResolution)
81+import Data.Fixed (Fixed, HasResolution)
86−import Data.Functor.Compose (Compose (..))
82+import Data.Functor.Compose (Compose(..))
87−import Data.Functor.Identity (Identity (..))
83+import Data.Functor.Identity (Identity(..))
88−import Data.Functor.Product (Product (..))
84+import Data.Functor.Product (Product(..))
89−import Data.Functor.Sum (Sum (..))
85+import Data.Functor.Sum (Sum(..))
90−import Data.Hashable (Hashable (..))
86+import Data.Hashable (Hashable(..))
91−import Data.Int (Int16, Int32, Int64, Int8)
87+import Data.Int (Int16, Int32, Int64, Int8)
92−import Data.List.NonEmpty (NonEmpty (..))
88+import Data.List.NonEmpty (NonEmpty(..))
93−import Data.Maybe (fromMaybe)
89+import Data.Maybe (fromMaybe)
94−import Data.Monoid (Dual (..), First (..), Last (..), (<>))
90+import Data.Monoid ((<>), Dual(..), First (..), Last (..))
95−import Data.Proxy (Proxy (..))
91+import Data.Proxy (Proxy(..))
96−import Data.Ratio (Ratio, (%))
92+import Data.Ratio ((%), Ratio)
97−import Data.Scientific (Scientific)
93+import Data.Scientific (Scientific)
98−import Data.Tagged (Tagged (..))
94+import Data.Tagged (Tagged(..))
99−import Data.Text (Text, pack, unpack)
95+import Data.Text (Text, pack, unpack)
100−import Data.Time (Day, LocalTime, NominalDiffTime, TimeOfDay,
96+import Data.Time (Day, LocalTime, NominalDiffTime, TimeOfDay, UTCTime, ZonedTime)
101− UTCTime, ZonedTime)
102−import Data.Time.Format (parseTime)
97+import Data.Time.Format (parseTime)
103−import Data.Time.Locale.Compat (defaultTimeLocale)
98+import Data.Time.Locale.Compat (defaultTimeLocale)
104−import Data.Traversable as Tr (sequence)
99+import Data.Traversable as Tr (sequence)
105−import Data.Vector (Vector)
100+import Data.Vector (Vector)
106−import Data.Version (Version, parseVersion)
101+import Data.Version (Version, parseVersion)
107−import Data.Word (Word16, Word32, Word64, Word8)
102+import Data.Word (Word16, Word32, Word64, Word8)
108−import Foreign.Storable (Storable)
103+import Foreign.Storable (Storable)
109import GHC.Generics
104import GHC.Generics
110−import Numeric.Natural (Natural)
105+import Numeric.Natural (Natural)
111import Text.ParserCombinators.ReadP (readP_to_S)
106import Text.ParserCombinators.ReadP (readP_to_S)
112−
107+import qualified Data.Aeson.Parser.Time as Time
113−import qualified Data.DList as DList
108+import qualified Data.Attoparsec.ByteString.Char8 as A (endOfInput, parseOnly, scientific)
109+import qualified Data.DList as DList
114−import qualified Data.HashMap.Strict as H
110+import qualified Data.HashMap.Strict as H
115−import qualified Data.HashSet as HashSet
111+import qualified Data.HashSet as HashSet
116−import qualified Data.IntMap as IntMap
112+import qualified Data.IntMap as IntMap
117−import qualified Data.IntSet as IntSet
113+import qualified Data.IntSet as IntSet
118−import qualified Data.Map as M
114+import qualified Data.Map as M
119−import qualified Data.Scientific as Scientific
115+import qualified Data.Scientific as Scientific
120−import qualified Data.Sequence as Seq
116+import qualified Data.Sequence as Seq
121−import qualified Data.Set as Set
117+import qualified Data.Set as Set
122−import qualified Data.Text as T
118+import qualified Data.Text as T
123−import qualified Data.Text.Encoding as T
119+import qualified Data.Text.Encoding as T
124−import qualified Data.Text.Lazy as LT
120+import qualified Data.Text.Lazy as LT
125−import qualified Data.Tree as Tree
121+import qualified Data.Tree as Tree
126−import qualified Data.Vector as V
122+import qualified Data.Vector as V
127−import qualified Data.Vector.Generic as VG
123+import qualified Data.Vector.Generic as VG
128import qualified Data.Vector.Primitive as VP
124import qualified Data.Vector.Primitive as VP
129−import qualified Data.Vector.Storable as VS
125+import qualified Data.Vector.Storable as VS
130−import qualified Data.Vector.Unboxed as VU
126+import qualified Data.Vector.Unboxed as VU
131−
132import Unsafe.Coerce (unsafeCoerce)
127import Unsafe.Coerce (unsafeCoerce)
133
128
134#ifndef HAS_COERCIBLE
129#ifndef HAS_COERCIBLE
@@ -1184,7 +1179,7 @@ instance FromJSON Int where
1184 {-# INLINE parseJSON #-}
1179 {-# INLINE parseJSON #-}
1185
1180
1186instance FromJSONKey Int where
1181instance FromJSONKey Int where
1187− fromJSONKey = FromJSONKeyTextParser $ parseBoundedIntegralText "Int"
1182+ fromJSONKey = FromJSONKeyTextParser $ parseBoundedIntegralText "Int"
1188
1183
1189-- | /WARNING:/ Only parse Integers from trusted input since an
1184-- | /WARNING:/ Only parse Integers from trusted input since an
1190-- attacker could easily fill up the memory of the target system by
1185-- attacker could easily fill up the memory of the target system by
Data/Aeson/Types/Generic.hs+21−10
@@ -1,13 +1,13 @@
1−{-# LANGUAGE CPP #-}
1+{-# LANGUAGE CPP #-}
2−{-# LANGUAGE DataKinds #-}
2+{-# LANGUAGE DataKinds #-}
3−{-# LANGUAGE EmptyDataDecls #-}
3+{-# LANGUAGE EmptyDataDecls #-}
4−{-# LANGUAGE FlexibleInstances #-}
4+{-# LANGUAGE FlexibleInstances #-}
5{-# LANGUAGE FunctionalDependencies #-}
5{-# LANGUAGE FunctionalDependencies #-}
6−{-# LANGUAGE KindSignatures #-}
6+{-# LANGUAGE KindSignatures #-}
7−{-# LANGUAGE MultiParamTypeClasses #-}
7+{-# LANGUAGE MultiParamTypeClasses #-}
8−{-# LANGUAGE ScopedTypeVariables #-}
8+{-# LANGUAGE ScopedTypeVariables #-}
9−{-# LANGUAGE TypeOperators #-}
9+{-# LANGUAGE TypeOperators #-}
10−{-# LANGUAGE UndecidableInstances #-}
10+{-# LANGUAGE UndecidableInstances #-}
11
11
12#include "overlapping-compat.h"
12#include "overlapping-compat.h"
13
13
@@ -23,7 +23,18 @@
23--
23--
24-- Helpers for generic derivations.
24-- Helpers for generic derivations.
25
25
26−module Data.Aeson.Types.Generic where
26+module Data.Aeson.Types.Generic
27+ (
28+ IsRecord(..)
29+ , AllNullary
30+ , Tagged2(..)
31+ , True
32+ , False
33+ , And
34+ , Zero
35+ , One
36+ , ProductSize(..)
37+ ) where
27
38
28import Prelude ()
39import Prelude ()
29import Prelude.Compat
40import Prelude.Compat
Data/Aeson/Types/Internal.hs+8−5
@@ -1,5 +1,8 @@
1+{-# LANGUAGE CPP #-}
2+{-# LANGUAGE DeriveDataTypeable #-}
1−{-# LANGUAGE CPP, DeriveDataTypeable, GeneralizedNewtypeDeriving, Rank2Types,
3+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
4+{-# LANGUAGE Rank2Types #-}
2− RecordWildCards #-}
5+{-# LANGUAGE RecordWildCards #-}
3#if __GLASGOW_HASKELL__ >= 800
6#if __GLASGOW_HASKELL__ >= 800
4-- a) THQ works on cross-compilers and unregisterised GHCs
7-- a) THQ works on cross-compilers and unregisterised GHCs
5-- b) may make compilation faster as no dynamic loading is ever needed (not sure about this)
8-- b) may make compilation faster as no dynamic loading is ever needed (not sure about this)
@@ -63,24 +66,24 @@ module Data.Aeson.Types.Internal
63import Prelude ()
66import Prelude ()
64import Prelude.Compat
67import Prelude.Compat
65
68
66−import Control.Arrow (first)
67import Control.Applicative (Alternative(..))
69import Control.Applicative (Alternative(..))
70+import Control.Arrow (first)
68import Control.DeepSeq (NFData(..))
71import Control.DeepSeq (NFData(..))
69import Control.Monad (MonadPlus(..), ap)
72import Control.Monad (MonadPlus(..), ap)
70−import qualified Control.Monad.Fail as Fail
71import Data.Char (isLower, isUpper, toLower, isAlpha, isAlphaNum)
73import Data.Char (isLower, isUpper, toLower, isAlpha, isAlphaNum)
72import Data.Data (Data)
74import Data.Data (Data)
73import Data.Foldable (foldl')
75import Data.Foldable (foldl')
74import Data.HashMap.Strict (HashMap)
76import Data.HashMap.Strict (HashMap)
75import Data.Hashable (Hashable(..))
77import Data.Hashable (Hashable(..))
76−import Data.Semigroup (Semigroup((<>)))
77import Data.Scientific (Scientific)
78import Data.Scientific (Scientific)
79+import Data.Semigroup (Semigroup((<>)))
78import Data.String (IsString(..))
80import Data.String (IsString(..))
79import Data.Text (Text, pack, unpack)
81import Data.Text (Text, pack, unpack)
80import Data.Time (UTCTime)
82import Data.Time (UTCTime)
81import Data.Time.Format (FormatTime)
83import Data.Time.Format (FormatTime)
82import Data.Typeable (Typeable)
84import Data.Typeable (Typeable)
83import Data.Vector (Vector)
85import Data.Vector (Vector)
86+import qualified Control.Monad.Fail as Fail
84import qualified Data.HashMap.Strict as H
87import qualified Data.HashMap.Strict as H
85import qualified Data.Scientific as S
88import qualified Data.Scientific as S
86import qualified Data.Vector as V
89import qualified Data.Vector as V
Data/Aeson/Types/ToJSON.hs+242−239
@@ -1,22 +1,22 @@
1−{-# LANGUAGE BangPatterns #-}
1+{-# LANGUAGE BangPatterns #-}
2−{-# LANGUAGE CPP #-}
2+{-# LANGUAGE CPP #-}
3−{-# LANGUAGE DataKinds #-}
3+{-# LANGUAGE DataKinds #-}
4−{-# LANGUAGE DefaultSignatures #-}
4+{-# LANGUAGE DefaultSignatures #-}
5−{-# LANGUAGE FlexibleContexts #-}
5+{-# LANGUAGE FlexibleContexts #-}
6−{-# LANGUAGE FlexibleInstances #-}
6+{-# LANGUAGE FlexibleInstances #-}
7−{-# LANGUAGE GADTs #-}
7+{-# LANGUAGE GADTs #-}
8{-# LANGUAGE MultiParamTypeClasses #-}
8{-# LANGUAGE MultiParamTypeClasses #-}
9−{-# LANGUAGE NamedFieldPuns #-}
9+{-# LANGUAGE NamedFieldPuns #-}
10−{-# LANGUAGE OverloadedStrings #-}
10+{-# LANGUAGE OverloadedStrings #-}
11−{-# LANGUAGE PatternGuards #-}
11+{-# LANGUAGE PatternGuards #-}
12−{-# LANGUAGE RecordWildCards #-}
12+{-# LANGUAGE RecordWildCards #-}
13−{-# LANGUAGE ScopedTypeVariables #-}
13+{-# LANGUAGE ScopedTypeVariables #-}
14−{-# LANGUAGE TypeOperators #-}
14+{-# LANGUAGE TypeOperators #-}
15−{-# LANGUAGE TypeSynonymInstances #-}
15+{-# LANGUAGE TypeSynonymInstances #-}
16−{-# LANGUAGE UndecidableInstances #-}
16+{-# LANGUAGE UndecidableInstances #-}
17
17
18#if __GLASGOW_HASKELL__ >= 706
18#if __GLASGOW_HASKELL__ >= 706
19−{-# LANGUAGE PolyKinds #-}
19+{-# LANGUAGE PolyKinds #-}
20#endif
20#endif
21
21
22#include "overlapping-compat.h"
22#include "overlapping-compat.h"
@@ -24,7 +24,8 @@
24-- TODO: Drop this when we remove support for Data.Attoparsec.Number
24-- TODO: Drop this when we remove support for Data.Attoparsec.Number
25{-# OPTIONS_GHC -fno-warn-deprecations #-}
25{-# OPTIONS_GHC -fno-warn-deprecations #-}
26
26
27−module Data.Aeson.Types.ToJSON (
27+module Data.Aeson.Types.ToJSON
28+ (
28 -- * Core JSON classes
29 -- * Core JSON classes
29 ToJSON(..)
30 ToJSON(..)
30 -- * Liftings to unary and binary type constructors
31 -- * Liftings to unary and binary type constructors
@@ -55,78 +56,73 @@ module Data.Aeson.Types.ToJSON (
55 , listValue
56 , listValue
56 ) where
57 ) where
57
58
58−import Prelude ()
59+import Prelude ()
59import Prelude.Compat
60import Prelude.Compat
60
61
62+import Control.Applicative (Const(..))
63+import Control.Monad.ST (ST)
61−import Data.Aeson.Encoding.Internal (Encoding, Encoding', Series, dict,
64+import Data.Aeson.Encoding (Encoding, Encoding', Series, dict, emptyArray_)
62− emptyArray_, tuple, (>*<), (><))
65+import Data.Aeson.Encoding.Internal ((>*<), (><))
63import Data.Aeson.Internal.Functions (mapHashKeyVal, mapKeyVal)
66import Data.Aeson.Internal.Functions (mapHashKeyVal, mapKeyVal)
64−import Data.Aeson.Types.Generic
67+import Data.Aeson.Types.Generic (AllNullary, False, IsRecord(..), One, ProductSize, Tagged2(..), True, Zero, productSize)
65import Data.Aeson.Types.Internal
68import Data.Aeson.Types.Internal
66−
67−-- We need internal here for generic deriving
68−import qualified Data.Aeson.Encoding.Internal as E
69−
70−import Control.Applicative (Const (..))
71−import Control.Monad.ST (ST)
72−import Data.Attoparsec.Number (Number (..))
69+import Data.Attoparsec.Number (Number(..))
73−import Data.Bits (unsafeShiftR)
70+import Data.Bits (unsafeShiftR)
74−import Data.DList (DList)
71+import Data.DList (DList)
75−import Data.Fixed (Fixed, HasResolution)
72+import Data.Fixed (Fixed, HasResolution)
76−import Data.Foldable (toList)
73+import Data.Foldable (toList)
77−import Data.Functor.Compose (Compose (..))
74+import Data.Functor.Compose (Compose(..))
78−import Data.Functor.Identity (Identity (..))
75+import Data.Functor.Identity (Identity(..))
79−import Data.Functor.Product (Product (..))
76+import Data.Functor.Product (Product(..))
80−import Data.Functor.Sum (Sum (..))
77+import Data.Functor.Sum (Sum(..))
81−import Data.Int (Int16, Int32, Int64, Int8)
78+import Data.Int (Int16, Int32, Int64, Int8)
82−import Data.List (intersperse)
79+import Data.List (intersperse)
83−import Data.List.NonEmpty (NonEmpty (..))
80+import Data.List.NonEmpty (NonEmpty(..))
84−import Data.Monoid (Dual (..), First (..), Last (..), (<>))
81+import Data.Monoid ((<>), Dual(..), First(..), Last(..))
85−import Data.Proxy (Proxy (..))
82+import Data.Proxy (Proxy(..))
86−import Data.Ratio (Ratio, denominator, numerator)
83+import Data.Ratio (Ratio, denominator, numerator)
87−import Data.Scientific (Scientific)
84+import Data.Scientific (Scientific)
88−import Data.Tagged (Tagged (..))
85+import Data.Tagged (Tagged(..))
89−import Data.Text (Text, pack)
86+import Data.Text (Text, pack)
90−import Data.Time (Day, LocalTime, NominalDiffTime, TimeOfDay,
87+import Data.Time (Day, LocalTime, NominalDiffTime, TimeOfDay, UTCTime, ZonedTime)
91− UTCTime, ZonedTime)
92−import Data.Time.Format (FormatTime, formatTime)
88+import Data.Time.Format (FormatTime, formatTime)
93import Data.Time.Locale.Compat (defaultTimeLocale)
89import Data.Time.Locale.Compat (defaultTimeLocale)
94−import Data.Vector (Vector)
90+import Data.Vector (Vector)
95−import Data.Version (Version, showVersion)
91+import Data.Version (Version, showVersion)
96−import Data.Word (Word16, Word32, Word64, Word8)
92+import Data.Word (Word16, Word32, Word64, Word8)
97−import Foreign.Storable (Storable)
93+import Foreign.Storable (Storable)
98import GHC.Generics
94import GHC.Generics
99−import Numeric.Natural (Natural)
95+import Numeric.Natural (Natural)
100−
96+import qualified Data.Aeson.Encoding as E
97+import qualified Data.Aeson.Encoding.Internal as E (InArray, colon, comma, econcat, empty, retagEncoding, wrapObject)
101−import qualified Data.ByteString as S
98+import qualified Data.ByteString as S
102−import qualified Data.ByteString.Lazy as L
99+import qualified Data.ByteString.Lazy as L
103−import qualified Data.DList as DList
100+import qualified Data.DList as DList
104−import qualified Data.HashMap.Strict as H
101+import qualified Data.HashMap.Strict as H
105−import qualified Data.HashSet as HashSet
102+import qualified Data.HashSet as HashSet
106−import qualified Data.IntMap as IntMap
103+import qualified Data.IntMap as IntMap
107−import qualified Data.IntSet as IntSet
104+import qualified Data.IntSet as IntSet
108−import qualified Data.List.NonEmpty as NE
105+import qualified Data.List.NonEmpty as NE
109−import qualified Data.Map as M
106+import qualified Data.Map as M
110−import qualified Data.Scientific as Scientific
107+import qualified Data.Scientific as Scientific
111−import qualified Data.Sequence as Seq
108+import qualified Data.Sequence as Seq
112−import qualified Data.Set as Set
109+import qualified Data.Set as Set
113−import qualified Data.Text as T
110+import qualified Data.Text as T
114−import qualified Data.Text.Encoding as T
111+import qualified Data.Text.Encoding as T
115−import qualified Data.Text.Lazy as LT
112+import qualified Data.Text.Lazy as LT
116−import qualified Data.Tree as Tree
113+import qualified Data.Tree as Tree
117−import qualified Data.Vector as V
114+import qualified Data.Vector as V
118−import qualified Data.Vector.Generic as VG
115+import qualified Data.Vector.Generic as VG
119−import qualified Data.Vector.Mutable as VM
116+import qualified Data.Vector.Mutable as VM
120import qualified Data.Vector.Primitive as VP
117import qualified Data.Vector.Primitive as VP
121−import qualified Data.Vector.Storable as VS
118+import qualified Data.Vector.Storable as VS
122−import qualified Data.Vector.Unboxed as VU
119+import qualified Data.Vector.Unboxed as VU
123
120
124#if !(MIN_VERSION_bytestring(0,10,0))
121#if !(MIN_VERSION_bytestring(0,10,0))
125−import Foreign.ForeignPtr (withForeignPtr)
122+import Foreign.ForeignPtr (withForeignPtr)
126import Foreign.Marshal.Utils (copyBytes)
123import Foreign.Marshal.Utils (copyBytes)
127−import Foreign.Ptr (plusPtr)
124+import Foreign.Ptr (plusPtr)
128−
129−import qualified Data.ByteString.Internal as S
125+import qualified Data.ByteString.Internal as S
130import qualified Data.ByteString.Lazy.Internal as L
126import qualified Data.ByteString.Lazy.Internal as L
131#endif
127#endif
132
128
@@ -725,7 +721,7 @@ instance ( EncodeProduct arity a
725 -- Products are encoded to an array. Here we allocate a mutable vector of
721 -- Products are encoded to an array. Here we allocate a mutable vector of
726 -- the same size as the product and write the product's elements to it using
722 -- the same size as the product and write the product's elements to it using
727 -- 'encodeProduct':
723 -- 'encodeProduct':
728− gToEncoding opts targs p = E.tuple $ encodeProduct opts targs p
724+ gToEncoding opts targs p = E.list E.retagEncoding [encodeProduct opts targs p]
729
725
730instance ( AllNullary (a :+: b) allNullary
726instance ( AllNullary (a :+: b) allNullary
731 , SumToEncoding arity (a :+: b) allNullary
727 , SumToEncoding arity (a :+: b) allNullary
@@ -880,13 +876,12 @@ instance ( IsRecord a isRecord
880 , TaggedObjectEnc' arity a isRecord
876 , TaggedObjectEnc' arity a isRecord
881 , Constructor c
877 , Constructor c
882 ) => TaggedObjectEnc arity (C1 c a) where
878 ) => TaggedObjectEnc arity (C1 c a) where
883− taggedObjectEnc opts targs tagFieldName contentsFieldName v =
879+ taggedObjectEnc opts targs tagFieldName contentsFieldName v = E.pairs (E.pair key val)
884− E.wrapObject $
880+ where
885− (E.string tagFieldName ><
881+ key :: Text
886− E.colon ><
882+ key = pack tagFieldName
887− toEncoding (constructorTagModifier opts (conName (undefined :: t c a p)))) ><
883+ val = toEncoding (constructorTagModifier opts (conName (undefined :: t c a p)))
888− ((unTagged :: Tagged isRecord Encoding -> Encoding) .
889− taggedObjectEnc' opts targs contentsFieldName . unM1 $ v)
884+ >< ((unTagged :: Tagged isRecord Encoding -> Encoding) . taggedObjectEnc' opts targs contentsFieldName . unM1 $ v)
890
885
891class TaggedObjectEnc' arity f isRecord where
886class TaggedObjectEnc' arity f isRecord where
892 taggedObjectEnc' :: Options -> ToArgs Encoding arity a
887 taggedObjectEnc' :: Options -> ToArgs Encoding arity a
@@ -956,9 +951,10 @@ instance ( GToEncoding arity a
956 , ConsToEncoding arity a
951 , ConsToEncoding arity a
957 , Constructor c
952 , Constructor c
958 ) => TwoElemArrayEnc arity (C1 c a) where
953 ) => TwoElemArrayEnc arity (C1 c a) where
959− twoElemArrayEnc opts targs x = E.tuple $
954+ twoElemArrayEnc opts targs x = E.list id
960− toEncoding (constructorTagModifier opts (conName (undefined :: t c a p))) >*<
955+ [ toEncoding (constructorTagModifier opts (conName (undefined :: t c a p)))
961− gToEncoding opts targs x
956+ , gToEncoding opts targs x
957+ ]
962
958
963--------------------------------------------------------------------------------
959--------------------------------------------------------------------------------
964
960
@@ -1124,8 +1120,9 @@ instance ( EncodeProduct arity a
1124 E.econcat $ intersperse E.comma $
1120 E.econcat $ intersperse E.comma $
1125 filter (not . E.nullEncoding)
1121 filter (not . E.nullEncoding)
1126 [encodeProduct opts targs a, encodeProduct opts targs b]
1122 [encodeProduct opts targs a, encodeProduct opts targs b]
1127− encodeProduct opts targs (a :*: b) = encodeProduct opts targs a >*<
1123+ encodeProduct opts targs (a :*: b) =
1124+ encodeProduct opts targs a >*<
1128− encodeProduct opts targs b
1125+ encodeProduct opts targs b
1129
1126
1130instance OVERLAPPABLE_ (GToEncoding arity a) => EncodeProduct arity a where
1127instance OVERLAPPABLE_ (GToEncoding arity a) => EncodeProduct arity a where
1131 encodeProduct opts targs a = E.retagEncoding $ gToEncoding opts targs a
1128 encodeProduct opts targs a = E.retagEncoding $ gToEncoding opts targs a
@@ -1171,14 +1168,12 @@ instance ( GToEncoding arity a
1171 , ConsToEncoding arity a
1168 , ConsToEncoding arity a
1172 , Constructor c
1169 , Constructor c
1173 ) => ObjectWithSingleFieldEnc arity (C1 c a) where
1170 ) => ObjectWithSingleFieldEnc arity (C1 c a) where
1174− objectWithSingleFieldEnc opts targs v =
1171+ objectWithSingleFieldEnc opts targs v = E.pairs (E.pair key val)
1175− E.openCurly ><
1172+ where
1176− toEncoding
1173+ key :: Text
1177− (constructorTagModifier opts
1174+ key = pack (constructorTagModifier opts (conName (undefined :: t c a p)))
1178− (conName (undefined :: t c a p))) ><
1175+ val :: Encoding' Value
1179− E.colon ><
1180− gToEncoding opts targs v ><
1176+ val = gToEncoding opts targs v
1181− E.closeCurly
1182
1177
1183--------------------------------------------------------------------------------
1178--------------------------------------------------------------------------------
1184
1179
@@ -1813,13 +1808,11 @@ instance ToJSONKey k => ToJSON1 (M.Map k) where
1813 ToJSONKeyValue f _ -> Array . V.fromList . map (toJSONPair f g) . M.toList
1808 ToJSONKeyValue f _ -> Array . V.fromList . map (toJSONPair f g) . M.toList
1814 {-# INLINE liftToJSON #-}
1809 {-# INLINE liftToJSON #-}
1815
1810
1816− -- liftToEncoding :: forall a. (a -> Encoding) -> ([a] -> Encoding) -> M.Map k a -> Encoding
1817 liftToEncoding g _ = case toJSONKey of
1811 liftToEncoding g _ = case toJSONKey of
1818 ToJSONKeyText _ f -> dict f g M.foldrWithKey
1812 ToJSONKeyText _ f -> dict f g M.foldrWithKey
1819 ToJSONKeyValue _ f -> listEncoding (pairEncoding f) . M.toList
1813 ToJSONKeyValue _ f -> listEncoding (pairEncoding f) . M.toList
1820 where
1814 where
1821− -- pairEncoding :: (k -> Encoding) -> (k, a) -> Encoding
1822− pairEncoding f (a, b) = tuple $ f a >*< g b
1815+ pairEncoding f (a, b) = E.list id [f a, g b]
1823 {-# INLINE liftToEncoding #-}
1816 {-# INLINE liftToEncoding #-}
1824
1817
1825
1818
@@ -1937,8 +1930,7 @@ instance ToJSONKey k => ToJSON1 (H.HashMap k) where
1937 ToJSONKeyText _ f -> dict f g H.foldrWithKey
1930 ToJSONKeyText _ f -> dict f g H.foldrWithKey
1938 ToJSONKeyValue _ f -> listEncoding (pairEncoding f) . H.toList
1931 ToJSONKeyValue _ f -> listEncoding (pairEncoding f) . H.toList
1939 where
1932 where
1940− -- pairEncoding :: (k -> Encoding) -> (k, a) -> Encoding
1941− pairEncoding f (a, b) = tuple $ f a >*< g b
1933+ pairEncoding f (a, b) = E.list id [f a, g b]
1942 {-# INLINE liftToEncoding #-}
1934 {-# INLINE liftToEncoding #-}
1943
1935
1944instance (ToJSON v, ToJSONKey k) => ToJSON (H.HashMap k v) where
1936instance (ToJSON v, ToJSONKey k) => ToJSON (H.HashMap k v) where
@@ -2125,7 +2117,7 @@ instance (ToJSONKey a, ToJSON a) => ToJSONKey [a] where
2125 toJSONKey = toJSONKeyList
2117 toJSONKey = toJSONKeyList
2126
2118
2127-------------------------------------------------------------------------------
2119-------------------------------------------------------------------------------
2128−-- Tuple instances, see tuple-instances-to.hs
2120+-- Tuple instances
2129-------------------------------------------------------------------------------
2121-------------------------------------------------------------------------------
2130
2122
2131instance ToJSON2 (,) where
2123instance ToJSON2 (,) where
@@ -2136,9 +2128,7 @@ instance ToJSON2 (,) where
2136 return mv
2128 return mv
2137 {-# INLINE liftToJSON2 #-}
2129 {-# INLINE liftToJSON2 #-}
2138
2130
2139− liftToEncoding2 toA _ toB _ (a, b) = tuple $
2131+ liftToEncoding2 toA _ toB _ (a, b) = E.list id [toA a, toB b]
2140− toA a >*<
2141− toB b
2142 {-# INLINE liftToEncoding2 #-}
2132 {-# INLINE liftToEncoding2 #-}
2143
2133
2144instance (ToJSON a) => ToJSON1 ((,) a) where
2134instance (ToJSON a) => ToJSON1 ((,) a) where
@@ -2162,10 +2152,11 @@ instance (ToJSON a) => ToJSON2 ((,,) a) where
2162 return mv
2152 return mv
2163 {-# INLINE liftToJSON2 #-}
2153 {-# INLINE liftToJSON2 #-}
2164
2154
2165− liftToEncoding2 toB _ toC _ (a, b, c) = tuple $
2155+ liftToEncoding2 toB _ toC _ (a, b, c) = E.list id
2166− toEncoding a >*<
2156+ [ toEncoding a
2167− toB b >*<
2157+ , toB b
2168− toC c
2158+ , toC c
2159+ ]
2169 {-# INLINE liftToEncoding2 #-}
2160 {-# INLINE liftToEncoding2 #-}
2170
2161
2171instance (ToJSON a, ToJSON b) => ToJSON1 ((,,) a b) where
2162instance (ToJSON a, ToJSON b) => ToJSON1 ((,,) a b) where
@@ -2190,11 +2181,12 @@ instance (ToJSON a, ToJSON b) => ToJSON2 ((,,,) a b) where
2190 return mv
2181 return mv
2191 {-# INLINE liftToJSON2 #-}
2182 {-# INLINE liftToJSON2 #-}
2192
2183
2193− liftToEncoding2 toC _ toD _ (a, b, c, d) = tuple $
2184+ liftToEncoding2 toC _ toD _ (a, b, c, d) = E.list id
2194− toEncoding a >*<
2185+ [ toEncoding a
2195− toEncoding b >*<
2186+ , toEncoding b
2196− toC c >*<
2187+ , toC c
2197− toD d
2188+ , toD d
2189+ ]
2198 {-# INLINE liftToEncoding2 #-}
2190 {-# INLINE liftToEncoding2 #-}
2199
2191
2200instance (ToJSON a, ToJSON b, ToJSON c) => ToJSON1 ((,,,) a b c) where
2192instance (ToJSON a, ToJSON b, ToJSON c) => ToJSON1 ((,,,) a b c) where
@@ -2220,12 +2212,13 @@ instance (ToJSON a, ToJSON b, ToJSON c) => ToJSON2 ((,,,,) a b c) where
2220 return mv
2212 return mv
2221 {-# INLINE liftToJSON2 #-}
2213 {-# INLINE liftToJSON2 #-}
2222
2214
2223− liftToEncoding2 toD _ toE _ (a, b, c, d, e) = tuple $
2215+ liftToEncoding2 toD _ toE _ (a, b, c, d, e) = E.list id
2224− toEncoding a >*<
2216+ [ toEncoding a
2225− toEncoding b >*<
2217+ , toEncoding b
2226− toEncoding c >*<
2218+ , toEncoding c
2227− toD d >*<
2219+ , toD d
2228− toE e
2220+ , toE e
2221+ ]
2229 {-# INLINE liftToEncoding2 #-}
2222 {-# INLINE liftToEncoding2 #-}
2230
2223
2231instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d) => ToJSON1 ((,,,,) a b c d) where
2224instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d) => ToJSON1 ((,,,,) a b c d) where
@@ -2252,13 +2245,14 @@ instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d) => ToJSON2 ((,,,,,) a b c d) w
2252 return mv
2245 return mv
2253 {-# INLINE liftToJSON2 #-}
2246 {-# INLINE liftToJSON2 #-}
2254
2247
2255− liftToEncoding2 toE _ toF _ (a, b, c, d, e, f) = tuple $
2248+ liftToEncoding2 toE _ toF _ (a, b, c, d, e, f) = E.list id
2256− toEncoding a >*<
2249+ [ toEncoding a
2257− toEncoding b >*<
2250+ , toEncoding b
2258− toEncoding c >*<
2251+ , toEncoding c
2259− toEncoding d >*<
2252+ , toEncoding d
2260− toE e >*<
2253+ , toE e
2261− toF f
2254+ , toF f
2255+ ]
2262 {-# INLINE liftToEncoding2 #-}
2256 {-# INLINE liftToEncoding2 #-}
2263
2257
2264instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e) => ToJSON1 ((,,,,,) a b c d e) where
2258instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e) => ToJSON1 ((,,,,,) a b c d e) where
@@ -2286,14 +2280,15 @@ instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e) => ToJSON2 ((,,,,,,)
2286 return mv
2280 return mv
2287 {-# INLINE liftToJSON2 #-}
2281 {-# INLINE liftToJSON2 #-}
2288
2282
2289− liftToEncoding2 toF _ toG _ (a, b, c, d, e, f, g) = tuple $
2283+ liftToEncoding2 toF _ toG _ (a, b, c, d, e, f, g) = E.list id
2290− toEncoding a >*<
2284+ [ toEncoding a
2291− toEncoding b >*<
2285+ , toEncoding b
2292− toEncoding c >*<
2286+ , toEncoding c
2293− toEncoding d >*<
2287+ , toEncoding d
2294− toEncoding e >*<
2288+ , toEncoding e
2295− toF f >*<
2289+ , toF f
2296− toG g
2290+ , toG g
2291+ ]
2297 {-# INLINE liftToEncoding2 #-}
2292 {-# INLINE liftToEncoding2 #-}
2298
2293
2299instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f) => ToJSON1 ((,,,,,,) a b c d e f) where
2294instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f) => ToJSON1 ((,,,,,,) a b c d e f) where
@@ -2322,15 +2317,16 @@ instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f) => ToJSON2
2322 return mv
2317 return mv
2323 {-# INLINE liftToJSON2 #-}
2318 {-# INLINE liftToJSON2 #-}
2324
2319
2325− liftToEncoding2 toG _ toH _ (a, b, c, d, e, f, g, h) = tuple $
2320+ liftToEncoding2 toG _ toH _ (a, b, c, d, e, f, g, h) = E.list id
2326− toEncoding a >*<
2321+ [ toEncoding a
2327− toEncoding b >*<
2322+ , toEncoding b
2328− toEncoding c >*<
2323+ , toEncoding c
2329− toEncoding d >*<
2324+ , toEncoding d
2330− toEncoding e >*<
2325+ , toEncoding e
2331− toEncoding f >*<
2326+ , toEncoding f
2332− toG g >*<
2327+ , toG g
2333− toH h
2328+ , toH h
2329+ ]
2334 {-# INLINE liftToEncoding2 #-}
2330 {-# INLINE liftToEncoding2 #-}
2335
2331
2336instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g) => ToJSON1 ((,,,,,,,) a b c d e f g) where
2332instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g) => ToJSON1 ((,,,,,,,) a b c d e f g) where
@@ -2360,16 +2356,17 @@ instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g)
2360 return mv
2356 return mv
2361 {-# INLINE liftToJSON2 #-}
2357 {-# INLINE liftToJSON2 #-}
2362
2358
2363− liftToEncoding2 toH _ toI _ (a, b, c, d, e, f, g, h, i) = tuple $
2359+ liftToEncoding2 toH _ toI _ (a, b, c, d, e, f, g, h, i) = E.list id
2364− toEncoding a >*<
2360+ [ toEncoding a
2365− toEncoding b >*<
2361+ , toEncoding b
2366− toEncoding c >*<
2362+ , toEncoding c
2367− toEncoding d >*<
2363+ , toEncoding d
2368− toEncoding e >*<
2364+ , toEncoding e
2369− toEncoding f >*<
2365+ , toEncoding f
2370− toEncoding g >*<
2366+ , toEncoding g
2371− toH h >*<
2367+ , toH h
2372− toI i
2368+ , toI i
2369+ ]
2373 {-# INLINE liftToEncoding2 #-}
2370 {-# INLINE liftToEncoding2 #-}
2374
2371
2375instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g, ToJSON h) => ToJSON1 ((,,,,,,,,) a b c d e f g h) where
2372instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g, ToJSON h) => ToJSON1 ((,,,,,,,,) a b c d e f g h) where
@@ -2400,17 +2397,18 @@ instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g,
2400 return mv
2397 return mv
2401 {-# INLINE liftToJSON2 #-}
2398 {-# INLINE liftToJSON2 #-}
2402
2399
2403− liftToEncoding2 toI _ toJ _ (a, b, c, d, e, f, g, h, i, j) = tuple $
2400+ liftToEncoding2 toI _ toJ _ (a, b, c, d, e, f, g, h, i, j) = E.list id
2404− toEncoding a >*<
2401+ [ toEncoding a
2405− toEncoding b >*<
2402+ , toEncoding b
2406− toEncoding c >*<
2403+ , toEncoding c
2407− toEncoding d >*<
2404+ , toEncoding d
2408− toEncoding e >*<
2405+ , toEncoding e
2409− toEncoding f >*<
2406+ , toEncoding f
2410− toEncoding g >*<
2407+ , toEncoding g
2411− toEncoding h >*<
2408+ , toEncoding h
2412− toI i >*<
2409+ , toI i
2413− toJ j
2410+ , toJ j
2411+ ]
2414 {-# INLINE liftToEncoding2 #-}
2412 {-# INLINE liftToEncoding2 #-}
2415
2413
2416instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g, ToJSON h, ToJSON i) => ToJSON1 ((,,,,,,,,,) a b c d e f g h i) where
2414instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g, ToJSON h, ToJSON i) => ToJSON1 ((,,,,,,,,,) a b c d e f g h i) where
@@ -2442,18 +2440,19 @@ instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g,
2442 return mv
2440 return mv
2443 {-# INLINE liftToJSON2 #-}
2441 {-# INLINE liftToJSON2 #-}
2444
2442
2445− liftToEncoding2 toJ _ toK _ (a, b, c, d, e, f, g, h, i, j, k) = tuple $
2443+ liftToEncoding2 toJ _ toK _ (a, b, c, d, e, f, g, h, i, j, k) = E.list id
2446− toEncoding a >*<
2444+ [ toEncoding a
2447− toEncoding b >*<
2445+ , toEncoding b
2448− toEncoding c >*<
2446+ , toEncoding c
2449− toEncoding d >*<
2447+ , toEncoding d
2450− toEncoding e >*<
2448+ , toEncoding e
2451− toEncoding f >*<
2449+ , toEncoding f
2452− toEncoding g >*<
2450+ , toEncoding g
2453− toEncoding h >*<
2451+ , toEncoding h
2454− toEncoding i >*<
2452+ , toEncoding i
2455− toJ j >*<
2453+ , toJ j
2456− toK k
2454+ , toK k
2455+ ]
2457 {-# INLINE liftToEncoding2 #-}
2456 {-# INLINE liftToEncoding2 #-}
2458
2457
2459instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g, ToJSON h, ToJSON i, ToJSON j) => ToJSON1 ((,,,,,,,,,,) a b c d e f g h i j) where
2458instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g, ToJSON h, ToJSON i, ToJSON j) => ToJSON1 ((,,,,,,,,,,) a b c d e f g h i j) where
@@ -2486,19 +2485,20 @@ instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g,
2486 return mv
2485 return mv
2487 {-# INLINE liftToJSON2 #-}
2486 {-# INLINE liftToJSON2 #-}
2488
2487
2489− liftToEncoding2 toK _ toL _ (a, b, c, d, e, f, g, h, i, j, k, l) = tuple $
2488+ liftToEncoding2 toK _ toL _ (a, b, c, d, e, f, g, h, i, j, k, l) = E.list id
2490− toEncoding a >*<
2489+ [ toEncoding a
2491− toEncoding b >*<
2490+ , toEncoding b
2492− toEncoding c >*<
2491+ , toEncoding c
2493− toEncoding d >*<
2492+ , toEncoding d
2494− toEncoding e >*<
2493+ , toEncoding e
2495− toEncoding f >*<
2494+ , toEncoding f
2496− toEncoding g >*<
2495+ , toEncoding g
2497− toEncoding h >*<
2496+ , toEncoding h
2498− toEncoding i >*<
2497+ , toEncoding i
2499− toEncoding j >*<
2498+ , toEncoding j
2500− toK k >*<
2499+ , toK k
2501− toL l
2500+ , toL l
2501+ ]
2502 {-# INLINE liftToEncoding2 #-}
2502 {-# INLINE liftToEncoding2 #-}
2503
2503
2504instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g, ToJSON h, ToJSON i, ToJSON j, ToJSON k) => ToJSON1 ((,,,,,,,,,,,) a b c d e f g h i j k) where
2504instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g, ToJSON h, ToJSON i, ToJSON j, ToJSON k) => ToJSON1 ((,,,,,,,,,,,) a b c d e f g h i j k) where
@@ -2532,20 +2532,21 @@ instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g,
2532 return mv
2532 return mv
2533 {-# INLINE liftToJSON2 #-}
2533 {-# INLINE liftToJSON2 #-}
2534
2534
2535− liftToEncoding2 toL _ toM _ (a, b, c, d, e, f, g, h, i, j, k, l, m) = tuple $
2535+ liftToEncoding2 toL _ toM _ (a, b, c, d, e, f, g, h, i, j, k, l, m) = E.list id
2536− toEncoding a >*<
2536+ [ toEncoding a
2537− toEncoding b >*<
2537+ , toEncoding b
2538− toEncoding c >*<
2538+ , toEncoding c
2539− toEncoding d >*<
2539+ , toEncoding d
2540− toEncoding e >*<
2540+ , toEncoding e
2541− toEncoding f >*<
2541+ , toEncoding f
2542− toEncoding g >*<
2542+ , toEncoding g
2543− toEncoding h >*<
2543+ , toEncoding h
2544− toEncoding i >*<
2544+ , toEncoding i
2545− toEncoding j >*<
2545+ , toEncoding j
2546− toEncoding k >*<
2546+ , toEncoding k
2547− toL l >*<
2547+ , toL l
2548− toM m
2548+ , toM m
2549+ ]
2549 {-# INLINE liftToEncoding2 #-}
2550 {-# INLINE liftToEncoding2 #-}
2550
2551
2551instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g, ToJSON h, ToJSON i, ToJSON j, ToJSON k, ToJSON l) => ToJSON1 ((,,,,,,,,,,,,) a b c d e f g h i j k l) where
2552instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g, ToJSON h, ToJSON i, ToJSON j, ToJSON k, ToJSON l) => ToJSON1 ((,,,,,,,,,,,,) a b c d e f g h i j k l) where
@@ -2580,21 +2581,22 @@ instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g,
2580 return mv
2581 return mv
2581 {-# INLINE liftToJSON2 #-}
2582 {-# INLINE liftToJSON2 #-}
2582
2583
2583− liftToEncoding2 toM _ toN _ (a, b, c, d, e, f, g, h, i, j, k, l, m, n) = tuple $
2584+ liftToEncoding2 toM _ toN _ (a, b, c, d, e, f, g, h, i, j, k, l, m, n) = E.list id
2584− toEncoding a >*<
2585+ [ toEncoding a
2585− toEncoding b >*<
2586+ , toEncoding b
2586− toEncoding c >*<
2587+ , toEncoding c
2587− toEncoding d >*<
2588+ , toEncoding d
2588− toEncoding e >*<
2589+ , toEncoding e
2589− toEncoding f >*<
2590+ , toEncoding f
2590− toEncoding g >*<
2591+ , toEncoding g
2591− toEncoding h >*<
2592+ , toEncoding h
2592− toEncoding i >*<
2593+ , toEncoding i
2593− toEncoding j >*<
2594+ , toEncoding j
2594− toEncoding k >*<
2595+ , toEncoding k
2595− toEncoding l >*<
2596+ , toEncoding l
2596− toM m >*<
2597+ , toM m
2597− toN n
2598+ , toN n
2599+ ]
2598 {-# INLINE liftToEncoding2 #-}
2600 {-# INLINE liftToEncoding2 #-}
2599
2601
2600instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g, ToJSON h, ToJSON i, ToJSON j, ToJSON k, ToJSON l, ToJSON m) => ToJSON1 ((,,,,,,,,,,,,,) a b c d e f g h i j k l m) where
2602instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g, ToJSON h, ToJSON i, ToJSON j, ToJSON k, ToJSON l, ToJSON m) => ToJSON1 ((,,,,,,,,,,,,,) a b c d e f g h i j k l m) where
@@ -2630,22 +2632,23 @@ instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g,
2630 return mv
2632 return mv
2631 {-# INLINE liftToJSON2 #-}
2633 {-# INLINE liftToJSON2 #-}
2632
2634
2633− liftToEncoding2 toN _ toO _ (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) = tuple $
2635+ liftToEncoding2 toN _ toO _ (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) = E.list id
2634− toEncoding a >*<
2636+ [ toEncoding a
2635− toEncoding b >*<
2637+ , toEncoding b
2636− toEncoding c >*<
2638+ , toEncoding c
2637− toEncoding d >*<
2639+ , toEncoding d
2638− toEncoding e >*<
2640+ , toEncoding e
2639− toEncoding f >*<
2641+ , toEncoding f
2640− toEncoding g >*<
2642+ , toEncoding g
2641− toEncoding h >*<
2643+ , toEncoding h
2642− toEncoding i >*<
2644+ , toEncoding i
2643− toEncoding j >*<
2645+ , toEncoding j
2644− toEncoding k >*<
2646+ , toEncoding k
2645− toEncoding l >*<
2647+ , toEncoding l
2646− toEncoding m >*<
2648+ , toEncoding m
2647− toN n >*<
2649+ , toN n
2648− toO o
2650+ , toO o
2651+ ]
2649 {-# INLINE liftToEncoding2 #-}
2652 {-# INLINE liftToEncoding2 #-}
2650
2653
2651instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g, ToJSON h, ToJSON i, ToJSON j, ToJSON k, ToJSON l, ToJSON m, ToJSON n) => ToJSON1 ((,,,,,,,,,,,,,,) a b c d e f g h i j k l m n) where
2654instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e, ToJSON f, ToJSON g, ToJSON h, ToJSON i, ToJSON j, ToJSON k, ToJSON l, ToJSON m, ToJSON n) => ToJSON1 ((,,,,,,,,,,,,,,) a b c d e f g h i j k l m n) where
aeson.cabal+11−1
@@ -58,6 +58,11 @@ flag developer
58 default: False
58 default: False
59 manual: True
59 manual: True
60
60
61+flag fast
62+ description: compile without optimizations
63+ default: False
64+ manual: True
65+
61flag bytestring-builder
66flag bytestring-builder
62 description: Depend on the bytestring-builder package for backwards compatibility.
67 description: Depend on the bytestring-builder package for backwards compatibility.
63 default: False
68 default: False
@@ -129,11 +134,16 @@ library
129 -- `Numeric.Natural` is available in base only since GHC 7.10 / base 4.8
134 -- `Numeric.Natural` is available in base only since GHC 7.10 / base 4.8
130 build-depends: nats >= 1 && < 1.2
135 build-depends: nats >= 1 && < 1.2
131
136
137+ ghc-options: -Wall
138+
132 if flag(developer)
139 if flag(developer)
133 ghc-options: -Werror
140 ghc-options: -Werror
134 ghc-prof-options: -auto-all
141 ghc-prof-options: -auto-all
135
142
143+ if flag(fast)
144+ ghc-options: -O0
145+ else
136− ghc-options: -O2 -Wall
146+ ghc-options: -O2
137
147
138 include-dirs: include
148 include-dirs: include
139
149
benchmarks/AesonCompareAutoInstances.hs+12−14
@@ -1,24 +1,22 @@
1−{-# LANGUAGE DeriveDataTypeable, DeriveGeneric, TemplateHaskell #-}
1+{-# LANGUAGE DeriveDataTypeable #-}
2+{-# LANGUAGE DeriveGeneric #-}
3+{-# LANGUAGE TemplateHaskell #-}
2
4
3−module Main where
5+module Main (main) where
4
6
5−--------------------------------------------------------------------------------
7+import Prelude ()
6−
8+import Prelude.Compat
7−import Criterion.Main hiding (defaultOptions)
8
9
9import Control.DeepSeq (NFData, rnf, deepseq)
10import Control.DeepSeq (NFData, rnf, deepseq)
10−
11+import Criterion.Main hiding (defaultOptions)
11−import Data.Typeable (Typeable)
12+import Data.Aeson.Encode
13+import Data.Aeson.TH
14+import Data.Aeson.Types
12import Data.Data (Data)
15import Data.Data (Data)
16+import Data.Typeable (Typeable)
13import GHC.Generics (Generic)
17import GHC.Generics (Generic)
14−
15−import Data.Aeson.Types
16−import Data.Aeson.TH
17−import qualified Data.Aeson.Generic as G (fromJSON, toJSON)
18−
19−import Data.Aeson.Encode
20−
21import Options
18import Options
19+import qualified Data.Aeson.Generic as G (fromJSON, toJSON)
22
20
23--------------------------------------------------------------------------------
21--------------------------------------------------------------------------------
24
22
benchmarks/AesonEncode.hs+9−2
@@ -1,5 +1,12 @@
1−{-# LANGUAGE BangPatterns, OverloadedStrings #-}
1+{-# LANGUAGE BangPatterns #-}
2+{-# LANGUAGE OverloadedStrings #-}
2
3
4+module Main (main) where
5+
6+import Prelude ()
7+import Prelude.Compat
8+
9+import Control.DeepSeq
3import Control.Exception
10import Control.Exception
4import Control.Monad
11import Control.Monad
5import Data.Aeson
12import Data.Aeson
@@ -9,7 +16,6 @@ import Data.Time.Clock
9import System.Environment (getArgs)
16import System.Environment (getArgs)
10import System.IO
17import System.IO
11import qualified Data.ByteString as B
18import qualified Data.ByteString as B
12−import Control.DeepSeq
13
19
14main :: IO ()
20main :: IO ()
15main = do
21main = do
@@ -17,6 +23,7 @@ main = do
17 let (cnt,args) = case args0 of
23 let (cnt,args) = case args0 of
18 (i:c:a) | all isDigit i && all isDigit c -> (c,a)
24 (i:c:a) | all isDigit i && all isDigit c -> (c,a)
19 (c:a) -> (c,a)
25 (c:a) -> (c,a)
26+ [] -> error "Unexpected empty list"
20 let count = read cnt :: Int
27 let count = read cnt :: Int
21 forM_ args $ \arg -> bracket (openFile arg ReadMode) hClose $ \h -> do
28 forM_ args $ \arg -> bracket (openFile arg ReadMode) hClose $ \h -> do
22 putStrLn $ arg ++ ":"
29 putStrLn $ arg ++ ":"
benchmarks/AesonFoldable.hs+9−4
@@ -1,11 +1,16 @@
1−{-# LANGUAGE OverloadedStrings, PackageImports #-}
1+{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE PackageImports #-}
3+
4+module Main (main) where
5+
2import Criterion.Main
6import Criterion.Main
3
7
4−import qualified "aeson" Data.Aeson as A
8+import Prelude ()
5−import qualified "aeson-benchmarks" Data.Aeson as B
9+import Prelude.Compat
6
10
7import Data.Foldable (toList)
11import Data.Foldable (toList)
8−
12+import qualified "aeson" Data.Aeson as A
13+import qualified "aeson-benchmarks" Data.Aeson as B
9import qualified Data.Sequence as S
14import qualified Data.Sequence as S
10import qualified Data.Vector as V
15import qualified Data.Vector as V
11import qualified Data.Vector.Unboxed as U
16import qualified Data.Vector.Unboxed as U
benchmarks/AesonMap.hs+15−7
@@ -1,19 +1,27 @@
1−{-# LANGUAGE OverloadedStrings, RankNTypes, PackageImports, FlexibleContexts #-}
1+{-# LANGUAGE FlexibleContexts #-}
2+{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE PackageImports #-}
4+{-# LANGUAGE RankNTypes #-}
5+
6+{-# OPTIONS_GHC -fno-warn-orphans #-}
7+
8+module Main (main) where
9+
10+import Prelude ()
11+import Prelude.Compat
2
12
3import Control.DeepSeq
13import Control.DeepSeq
4import Criterion.Main
14import Criterion.Main
5import Data.Hashable
15import Data.Hashable
6import Data.Proxy (Proxy (..))
16import Data.Proxy (Proxy (..))
7import Data.Tagged (Tagged (..))
17import Data.Tagged (Tagged (..))
8−import qualified Data.ByteString.Lazy as LBS
9−import qualified Data.Text as T
10−import qualified Data.Map as M
11−import qualified Data.HashMap.Strict as HM
12−
13import qualified "aeson" Data.Aeson as A
18import qualified "aeson" Data.Aeson as A
14−
15import qualified "aeson-benchmarks" Data.Aeson as B
19import qualified "aeson-benchmarks" Data.Aeson as B
16import qualified "aeson-benchmarks" Data.Aeson.Types as B (fromJSONKeyCoerce)
20import qualified "aeson-benchmarks" Data.Aeson.Types as B (fromJSONKeyCoerce)
21+import qualified Data.ByteString.Lazy as LBS
22+import qualified Data.HashMap.Strict as HM
23+import qualified Data.Map as M
24+import qualified Data.Text as T
17
25
18value :: Int -> HM.HashMap T.Text T.Text
26value :: Int -> HM.HashMap T.Text T.Text
19value n = HM.fromList $ map f [1..n]
27value n = HM.fromList $ map f [1..n]
benchmarks/AesonParse.hs+8−2
@@ -1,9 +1,15 @@
1−{-# LANGUAGE BangPatterns, OverloadedStrings #-}
1+{-# LANGUAGE BangPatterns #-}
2+{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE PackageImports #-}
3{-# LANGUAGE PackageImports #-}
3
4
5+module Main (main) where
6+
7+import Prelude ()
8+import Prelude.Compat
9+
10+import "aeson-benchmarks" Data.Aeson
4import Control.Exception
11import Control.Exception
5import Control.Monad
12import Control.Monad
6−import "aeson-benchmarks" Data.Aeson
7import Data.Attoparsec.ByteString (IResult(..), parseWith)
13import Data.Attoparsec.ByteString (IResult(..), parseWith)
8import Data.Time.Clock
14import Data.Time.Clock
9import System.Environment (getArgs)
15import System.Environment (getArgs)
benchmarks/AesonTuples.hs+5−2
@@ -1,9 +1,12 @@
1module Main where
1module Main where
2
2
3−--------------------------------------------------------------------------------
3+module Main (main) where
4+
5+import Prelude ()
6+import Prelude.Compat
4
7
5−import Criterion.Main
6import Control.DeepSeq (deepseq)
8import Control.DeepSeq (deepseq)
9+import Criterion.Main
7import Data.Aeson
10import Data.Aeson
8
11
9--------------------------------------------------------------------------------
12--------------------------------------------------------------------------------
benchmarks/Compare.hs+5−2
@@ -1,8 +1,11 @@
1−{-# LANGUAGE ScopedTypeVariables #-}
2{-# LANGUAGE PackageImports #-}
1{-# LANGUAGE PackageImports #-}
2+{-# LANGUAGE ScopedTypeVariables #-}
3
3
4module Main (main) where
4module Main (main) where
5
5
6+import Prelude ()
7+import Prelude.Compat
8+
6import Compare.BufferBuilder ()
9import Compare.BufferBuilder ()
7import Compare.JsonBuilder ()
10import Compare.JsonBuilder ()
8import Criterion.Main
11import Criterion.Main
@@ -11,8 +14,8 @@ import Data.Json.Builder
11import Twitter
14import Twitter
12import Twitter.Manual ()
15import Twitter.Manual ()
13import Typed.Common
16import Typed.Common
14−import qualified Compare.JsonBench as JsonBench
15import qualified "aeson-benchmarks" Data.Aeson as Aeson
17import qualified "aeson-benchmarks" Data.Aeson as Aeson
18+import qualified Compare.JsonBench as JsonBench
16
19
17main :: IO ()
20main :: IO ()
18main =
21main =
benchmarks/Compare/BufferBuilder.hs+9−3
@@ -1,11 +1,17 @@
1−{-# LANGUAGE OverloadedStrings, RecordWildCards #-}
1+{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE RecordWildCards #-}
3+
4+{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
2{-# OPTIONS_GHC -fno-warn-orphans #-}
5{-# OPTIONS_GHC -fno-warn-orphans #-}
3
6
4module Compare.BufferBuilder () where
7module Compare.BufferBuilder () where
5
8
9+import Prelude ()
10+import Prelude.Compat
11+
6import Data.BufferBuilder.Json
12import Data.BufferBuilder.Json
7−import Data.Monoid ((<>))
8import Data.Int (Int64)
13import Data.Int (Int64)
14+import Data.Monoid ((<>))
9import Prelude hiding (id)
15import Prelude hiding (id)
10import Twitter
16import Twitter
11import qualified Data.BufferBuilder.Utf8 as UB
17import qualified Data.BufferBuilder.Utf8 as UB
@@ -37,7 +43,7 @@ instance ToJson Story where
37 <> "metadata" .= metadata
43 <> "metadata" .= metadata
38 <> "to_user_id" .= to_user_id
44 <> "to_user_id" .= to_user_id
39 <> "text" .= text
45 <> "text" .= text
40− <> "id" .= id
46+ <> "id" .= id_
41 <> "from_user_id" .= from_user_id
47 <> "from_user_id" .= from_user_id
42 <> "geo" .= geo
48 <> "geo" .= geo
43 <> "iso_language_code" .= iso_language_code
49 <> "iso_language_code" .= iso_language_code
benchmarks/Compare/JsonBench.hs+8−2
@@ -2,12 +2,18 @@
2--
2--
3-- https://github.com/chadaustin/buffer-builder/blob/master/test.json
3-- https://github.com/chadaustin/buffer-builder/blob/master/test.json
4
4
5−{-# LANGUAGE BangPatterns, OverloadedStrings, RecordWildCards #-}
5+{-# LANGUAGE BangPatterns #-}
6{-# LANGUAGE GeneralizedNewtypeDeriving #-}
6{-# LANGUAGE GeneralizedNewtypeDeriving #-}
7−{-# LANGUAGE MagicHash, ScopedTypeVariables #-}
7+{-# LANGUAGE MagicHash #-}
8+{-# LANGUAGE OverloadedStrings #-}
9+{-# LANGUAGE RecordWildCards #-}
10+{-# LANGUAGE ScopedTypeVariables #-}
8
11
9module Compare.JsonBench (benchmarks) where
12module Compare.JsonBench (benchmarks) where
10
13
14+import Prelude ()
15+import Prelude.Compat
16+
11import Control.DeepSeq (NFData(..))
17import Control.DeepSeq (NFData(..))
12import Criterion
18import Criterion
13import Data.Aeson ((.:))
19import Data.Aeson ((.:))
benchmarks/Compare/JsonBuilder.hs+6−1
@@ -1,8 +1,13 @@
1{-# LANGUAGE RecordWildCards #-}
1{-# LANGUAGE RecordWildCards #-}
2+
3+{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
2{-# OPTIONS_GHC -fno-warn-orphans #-}
4{-# OPTIONS_GHC -fno-warn-orphans #-}
3
5
4module Compare.JsonBuilder () where
6module Compare.JsonBuilder () where
5
7
8+import Prelude ()
9+import Prelude.Compat
10+
6import Data.Json.Builder
11import Data.Json.Builder
7import Data.Monoid ((<>))
12import Data.Monoid ((<>))
8import Prelude hiding (id)
13import Prelude hiding (id)
@@ -36,7 +41,7 @@ instance JsObject Story where
36 row "metadata" metadata <>
41 row "metadata" metadata <>
37 row "to_user_id" to_user_id <>
42 row "to_user_id" to_user_id <>
38 row "text" text <>
43 row "text" text <>
39− row "id" id <>
44+ row "id" id_ <>
40 row "from_user_id" from_user_id <>
45 row "from_user_id" from_user_id <>
41 row "geo" geo <>
46 row "geo" geo <>
42 row "iso_language_code" iso_language_code <>
47 row "iso_language_code" iso_language_code <>
benchmarks/CompareWithJSON.hs+6−1
@@ -1,5 +1,10 @@
1{-# OPTIONS_GHC -fno-warn-orphans #-}
1{-# OPTIONS_GHC -fno-warn-orphans #-}
2
2
3+module Main (main) where
4+
5+import Prelude ()
6+import Prelude.Compat
7+
3import Blaze.ByteString.Builder (toLazyByteString)
8import Blaze.ByteString.Builder (toLazyByteString)
4import Blaze.ByteString.Builder.Char.Utf8 (fromString)
9import Blaze.ByteString.Builder.Char.Utf8 (fromString)
5import Control.DeepSeq (NFData(rnf))
10import Control.DeepSeq (NFData(rnf))
@@ -7,10 +12,10 @@ import Criterion.Main
7import qualified Data.Aeson as A
12import qualified Data.Aeson as A
8import qualified Data.Aeson.Text as A
13import qualified Data.Aeson.Text as A
9import qualified Data.ByteString.Lazy as BL
14import qualified Data.ByteString.Lazy as BL
10−import qualified Text.JSON as J
11import qualified Data.Text.Lazy as TL
15import qualified Data.Text.Lazy as TL
12import qualified Data.Text.Lazy.Builder as TLB
16import qualified Data.Text.Lazy.Builder as TLB
13import qualified Data.Text.Lazy.Encoding as TLE
17import qualified Data.Text.Lazy.Encoding as TLE
18+import qualified Text.JSON as J
14
19
15instance (NFData v) => NFData (J.JSObject v) where
20instance (NFData v) => NFData (J.JSObject v) where
16 rnf o = rnf (J.fromJSObject o)
21 rnf o = rnf (J.fromJSObject o)
benchmarks/Dates.hs+5−1
@@ -1,4 +1,8 @@
1−import Control.Applicative ((<$>))
1+module Main (main) where
2+
3+import Prelude ()
4+import Prelude.Compat
5+
2import Criterion.Main
6import Criterion.Main
3import Data.Aeson (decode, encode)
7import Data.Aeson (decode, encode)
4import Data.Time.Clock (UTCTime)
8import Data.Time.Clock (UTCTime)
benchmarks/JsonParse.hs+8−2
@@ -1,11 +1,17 @@
1−{-# LANGUAGE BangPatterns, ScopedTypeVariables #-}
1+{-# LANGUAGE BangPatterns #-}
2+{-# LANGUAGE ScopedTypeVariables #-}
2{-# OPTIONS_GHC -fno-warn-orphans #-}
3{-# OPTIONS_GHC -fno-warn-orphans #-}
3
4
5+module Main (main) where
6+
7+import Prelude ()
8+import Prelude.Compat
9+
4import Control.DeepSeq
10import Control.DeepSeq
5import Control.Monad
11import Control.Monad
6−import Text.JSON
7import Data.Time.Clock
12import Data.Time.Clock
8import System.Environment (getArgs)
13import System.Environment (getArgs)
14+import Text.JSON
9
15
10instance NFData JSValue where
16instance NFData JSValue where
11 rnf JSNull = ()
17 rnf JSNull = ()
benchmarks/Micro.hs+3−1
@@ -1,11 +1,13 @@
1module Main (main) where
1module Main (main) where
2
2
3+import Prelude ()
4+import Prelude.Compat
5+
3import Criterion.Main
6import Criterion.Main
4import qualified Data.Aeson.Encoding.Builder as AB
7import qualified Data.Aeson.Encoding.Builder as AB
5import qualified Data.ByteString.Builder as B
8import qualified Data.ByteString.Builder as B
6import qualified Data.Text as T
9import qualified Data.Text as T
7
10
8−
9main :: IO ()
11main :: IO ()
10main = do
12main = do
11 let txt = "append (append b (primBounded w1 x1)) (primBounded w2 x2)"
13 let txt = "append (append b (primBounded w1 x1)) (primBounded w2 x2)"
benchmarks/Options.hs+4−1
@@ -1,4 +1,7 @@
1−module Options where
1+module Options () where
2+
3+import Prelude ()
4+import Prelude.Compat
2
5
3import Data.Aeson.Types
6import Data.Aeson.Types
4
7
benchmarks/ReadFile.hs+7−1
@@ -1,4 +1,10 @@
1−{-# LANGUAGE BangPatterns, OverloadedStrings #-}
1+{-# LANGUAGE BangPatterns #-}
2+{-# LANGUAGE OverloadedStrings #-}
3+
4+module Main (main) where
5+
6+import Prelude ()
7+import Prelude.Compat
2
8
3import Control.DeepSeq
9import Control.DeepSeq
4import Control.Exception
10import Control.Exception
benchmarks/Typed.hs+3
@@ -1,5 +1,8 @@
1module Main (main) where
1module Main (main) where
2
2
3+import Prelude ()
4+import Prelude.Compat
5+
3import Criterion.Main
6import Criterion.Main
4import qualified Typed.Generic as Generic
7import qualified Typed.Generic as Generic
5import qualified Typed.Manual as Manual
8import qualified Typed.Manual as Manual
benchmarks/Typed/Common.hs+12−6
@@ -1,6 +1,17 @@
1−{-# LANGUAGE CPP, PackageImports #-}
1+{-# LANGUAGE CPP #-}
2+{-# LANGUAGE PackageImports #-}
3+
4+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
5+
2module Typed.Common (load) where
6module Typed.Common (load) where
3
7
8+import Prelude ()
9+import Prelude.Compat
10+
11+import Data.ByteString.Lazy as L
12+import System.Exit
13+import System.IO
14+
4#ifndef HAS_BOTH_AESON_AND_BENCHMARKS
15#ifndef HAS_BOTH_AESON_AND_BENCHMARKS
5import Data.Aeson hiding (Result)
16import Data.Aeson hiding (Result)
6#else
17#else
@@ -8,11 +19,6 @@ import "aeson" Data.Aeson hiding (Result)
8import qualified "aeson-benchmarks" Data.Aeson as B
19import qualified "aeson-benchmarks" Data.Aeson as B
9#endif
20#endif
10
21
11−import Data.ByteString.Lazy as L
12−import Control.Applicative
13−import System.IO
14−import System.Exit
15−
16load :: FromJSON a => FilePath -> IO a
22load :: FromJSON a => FilePath -> IO a
17load fileName = do
23load fileName = do
18 mv <- eitherDecode' <$> L.readFile fileName
24 mv <- eitherDecode' <$> L.readFile fileName
benchmarks/Typed/Generic.hs+4−3
@@ -1,14 +1,15 @@
1{-# LANGUAGE PackageImports #-}
1{-# LANGUAGE PackageImports #-}
2module Typed.Generic (benchmarks) where
2module Typed.Generic (benchmarks) where
3
3
4−import "aeson" Data.Aeson hiding (Result)
4+import Prelude ()
5−import qualified "aeson-benchmarks" Data.Aeson as B
5+import Prelude.Compat
6
6
7−import Control.Applicative
7+import "aeson" Data.Aeson hiding (Result)
8import Criterion
8import Criterion
9import Data.ByteString.Lazy as L
9import Data.ByteString.Lazy as L
10import Twitter.TH
10import Twitter.TH
11import Typed.Common
11import Typed.Common
12+import qualified "aeson-benchmarks" Data.Aeson as B
12
13
13encodeDirectA :: Result -> L.ByteString
14encodeDirectA :: Result -> L.ByteString
14encodeDirectA = encode
15encodeDirectA = encode
benchmarks/Typed/Manual.hs+4−3
@@ -1,14 +1,15 @@
1{-# LANGUAGE PackageImports #-}
1{-# LANGUAGE PackageImports #-}
2module Typed.Manual (benchmarks) where
2module Typed.Manual (benchmarks) where
3
3
4−import "aeson" Data.Aeson hiding (Result)
4+import Prelude ()
5−import qualified "aeson-benchmarks" Data.Aeson as B
5+import Prelude.Compat
6
6
7−import Control.Applicative
7+import "aeson" Data.Aeson hiding (Result)
8import Criterion
8import Criterion
9import Data.ByteString.Lazy as L
9import Data.ByteString.Lazy as L
10import Twitter.Manual
10import Twitter.Manual
11import Typed.Common
11import Typed.Common
12+import qualified "aeson-benchmarks" Data.Aeson as B
12
13
13encodeDirectA :: Result -> L.ByteString
14encodeDirectA :: Result -> L.ByteString
14encodeDirectA = encode
15encodeDirectA = encode
benchmarks/Typed/TH.hs+4−4
@@ -1,15 +1,15 @@
1{-# LANGUAGE PackageImports #-}
1{-# LANGUAGE PackageImports #-}
2module Typed.TH (benchmarks) where
2module Typed.TH (benchmarks) where
3
3
4−import "aeson" Data.Aeson hiding (Result)
4+import Prelude ()
5−import qualified "aeson-benchmarks" Data.Aeson as B
5+import Prelude.Compat
6
6
7−import Control.Applicative
7+import "aeson" Data.Aeson hiding (Result)
8import Criterion
8import Criterion
9−import Data.ByteString.Builder as B
10import Data.ByteString.Lazy as L
9import Data.ByteString.Lazy as L
11import Twitter.TH
10import Twitter.TH
12import Typed.Common
11import Typed.Common
12+import qualified "aeson-benchmarks" Data.Aeson as B
13
13
14encodeDirectA :: Result -> L.ByteString
14encodeDirectA :: Result -> L.ByteString
15encodeDirectA = encode
15encodeDirectA = encode
benchmarks/aeson-benchmarks.cabal+11−1
@@ -81,6 +81,7 @@ executable aeson-benchmark-compare
81 build-depends:
81 build-depends:
82 aeson-benchmarks,
82 aeson-benchmarks,
83 base,
83 base,
84+ base-compat,
84 buffer-builder,
85 buffer-builder,
85 bytestring,
86 bytestring,
86 criterion >= 1.0,
87 criterion >= 1.0,
@@ -96,6 +97,7 @@ executable aeson-benchmark-micro
96 build-depends:
97 build-depends:
97 aeson-benchmarks,
98 aeson-benchmarks,
98 base,
99 base,
100+ base-compat,
99 bytestring,
101 bytestring,
100 criterion >= 1.0,
102 criterion >= 1.0,
101 deepseq,
103 deepseq,
@@ -113,6 +115,7 @@ executable aeson-benchmark-typed
113 aeson,
115 aeson,
114 aeson-benchmarks,
116 aeson-benchmarks,
115 base,
117 base,
118+ base-compat,
116 criterion >= 1.0,
119 criterion >= 1.0,
117 deepseq,
120 deepseq,
118 ghc-prim,
121 ghc-prim,
@@ -131,6 +134,7 @@ executable aeson-benchmark-compare-with-json
131 build-depends:
134 build-depends:
132 aeson-benchmarks,
135 aeson-benchmarks,
133 base,
136 base,
137+ base-compat,
134 blaze-builder,
138 blaze-builder,
135 bytestring,
139 bytestring,
136 criterion,
140 criterion,
@@ -145,6 +149,7 @@ executable aeson-benchmark-aeson-encode
145 aeson-benchmarks,
149 aeson-benchmarks,
146 attoparsec,
150 attoparsec,
147 base,
151 base,
152+ base-compat,
148 bytestring,
153 bytestring,
149 deepseq,
154 deepseq,
150 time
155 time
@@ -156,6 +161,7 @@ executable aeson-benchmark-aeson-parse
156 aeson-benchmarks,
161 aeson-benchmarks,
157 attoparsec,
162 attoparsec,
158 base,
163 base,
164+ base-compat,
159 bytestring,
165 bytestring,
160 time
166 time
161
167
@@ -164,6 +170,7 @@ executable aeson-benchmark-json-parse
164 ghc-options: -Wall -O2 -rtsopts
170 ghc-options: -Wall -O2 -rtsopts
165 build-depends:
171 build-depends:
166 base,
172 base,
173+ base-compat,
167 deepseq,
174 deepseq,
168 json,
175 json,
169 time
176 time
@@ -173,6 +180,7 @@ executable aeson-benchmark-dates
173 ghc-options: -Wall -O2 -rtsopts
180 ghc-options: -Wall -O2 -rtsopts
174 build-depends:
181 build-depends:
175 base,
182 base,
183+ base-compat,
176 bytestring,
184 bytestring,
177 criterion,
185 criterion,
178 deepseq,
186 deepseq,
@@ -184,9 +192,10 @@ executable aeson-benchmark-map
184 main-is: AesonMap.hs
192 main-is: AesonMap.hs
185 ghc-options: -Wall -O2 -rtsopts
193 ghc-options: -Wall -O2 -rtsopts
186 build-depends:
194 build-depends:
187− aeson == 0.11.*,
195+ aeson,
188 aeson-benchmarks,
196 aeson-benchmarks,
189 base,
197 base,
198+ base-compat,
190 criterion >= 1.0,
199 criterion >= 1.0,
191 bytestring,
200 bytestring,
192 containers,
201 containers,
@@ -203,6 +212,7 @@ executable aeson-benchmark-foldable
203 aeson,
212 aeson,
204 aeson-benchmarks,
213 aeson-benchmarks,
205 base,
214 base,
215+ base-compat,
206 criterion >= 1.0,
216 criterion >= 1.0,
207 bytestring,
217 bytestring,
208 containers,
218 containers,
changelog.md+51−25
@@ -2,52 +2,78 @@ For the latest version of this document, please see [https://github.com/bos/aeso
2
2
3# 1.0.0.0
3# 1.0.0.0
4
4
5−* Added list specific members to `ToJSON` and `FromJSON` classes. In the same
5+Major enhancements:
6− way `Read` / `Show` handle lists specifically. This removes need for
7− overlapping instances to handle `String`.
8
6
9−* Added higher rank classes: `ToJSON1`, `ToJSON2`, `FromJSON1`, and `FromJSON2`.
7+* Introduced new `FromJSONKey` and `ToJSONKey` type classes that are
8+ used to encode maps without going through HashMap
10
9
11−* Modified instances for `Map` and `HashMap`. Introduced new `FromJSONKey` and
10+* Added higher rank classes: `ToJSON1`, `ToJSON2`, `FromJSON1`, and
12− `ToJSONKey` type classes.
11+ `FromJSON2`.
13
12
14−* Integral `FromJSON` instances do not accept non integral JSON numbers (e.g. `3.14`).
13+* Added `Data.Aeson.Encoding` with functions to safely write `ToJSON`
15− Also over/underflows are caught for bounded types.
14+ instances using `toEncoding`.
16
15
17−* Added `Data.Aeson.Encoding` with functions to work with `Encoding` in an abstract way.
16+Other enhancements:
18
17
19−* Added `UntaggedValue` to `SumEncoding`
18+* A Cabal `fast` flag was added to disable building with optimizations. This drastically speeds up compiling both aeson ***and*** libraries using aeson so it is recommended to enable it during development. With cabal-install you can `cabal install aeson -ffast` and with stack you can add a flag section to your stack.yaml:
19+```
20+flags:
21+ aeson:
22+ fast: true
23+```
20
24
21−* Export `decodeWith`, `decodeStrictWith`, `eitherDecodeWith`, and
25+* Added list specific members to `ToJSON` and `FromJSON` classes. In
22− `eitherDecodeStrictWith` from `Data.Aeson.Parser`. This allows
26+ the same way `Read` and `Show` handle lists specifically. This
23− decoding using explicit parsers instead of using `FromJSON`
27+ removes need for overlapping instances to handle `String`.
24− instances.
25
28
26−* Remove the `contents` field encoding with `allNullaryToStringTag = False`,
29+* Added a new `sumEncoding` option `UntaggedValue` which prevents
27− giving us `{ "tag" : "c1" }` instead of `{ "tag" : "c1", contents : [] }`.
30+ objects from being tagged with the constructor name.
28− The contents field is optional when parsing so this is only a breaking change for ToJSON.
29
31
30−* Fix a bug where `genericToEncoding` with `unwrapUnaryRecords = True`
32+* JSONPaths are now tracked in instances derived with template-haskell
31− would produce an invalid encoding: `"unwrap\":""`.
33+ and generics.
32
34
33* Get rid of redundancy of JSONPath error messages in nested records.
35* Get rid of redundancy of JSONPath error messages in nested records.
34
36
35 `eitherDecode "{\"x\":{\"a\": [1,2,true]}}" :: Either String Y`
37 `eitherDecode "{\"x\":{\"a\": [1,2,true]}}" :: Either String Y`
36− previously yielded `Error in $.x.a[2]: failed to parse field" x:
38+ previously yielded
37− failed to parse field a: expected Int, encountered Boolean` and now
39+ `Error in $.x.a[2]: failed to parse field" x: failed to parse field a: expected Int, encountered Boolean`
38− yields `Error in $.x.a[2]: expected Int, encountered Boolean"`.
40+ and now yields `Error in $.x.a[2]: expected Int, encountered Boolean"`.
39
41
40 Some users might prefer to insert `modifyFailure` themselves to
42 Some users might prefer to insert `modifyFailure` themselves to
41 customize error messages, which previously prevented the use of
43 customize error messages, which previously prevented the use of
42 `(.:)`.
44 `(.:)`.
43
45
46+* Backwards compatibility with `bytestring-0.9` using the
47+ `bytestring-builder` compatibility package.
48+
49+* Export `decodeWith`, `decodeStrictWith`, `eitherDecodeWith`, and
50+ `eitherDecodeStrictWith` from `Data.Aeson.Parser`. This allows
51+ decoding using explicit parsers instead of using `FromJSON`
52+ instances.
53+
54+* Un-orphan internal instances to render them in haddocks.
55+
56+Other changes:
57+
58+* Integral `FromJSON` instances now only accept integral
59+ values. E.g. parsing `3.14` to `Int` fails instead of succeeding
60+ with the value `3`.
61+
62+* Over/underflows are now caught for bounded numeric types.
63+
64+* Remove the `contents` field encoding with `allNullaryToStringTag = False`,
65+ giving us `{ "tag" : "c1" }` instead of `{ "tag" : "c1", contents : [] }`.
66+ The contents field is optional when parsing so this is only a breaking
67+ change for ToJSON instances.
68+
69+* Fix a bug where `genericToEncoding` with `unwrapUnaryRecords = True`
70+ would produce an invalid encoding: `"unwrap\":""`.
71+
44* `ToJSON` instances using `genericToEncoding` and `omitNothingFields`
72* `ToJSON` instances using `genericToEncoding` and `omitNothingFields`
45− no longer produces invalid JSON.
73+ no longer produce invalid JSON.
46
74
47* Added instances for `DList`, `Compose`, `Product`, `Sum`.
75* Added instances for `DList`, `Compose`, `Product`, `Sum`.
48
76
49−* Buildable with `bytestring-0.9` (with a help of `bytestring-builder` compatibility package).
50−
51### 0.11.2.0
77### 0.11.2.0
52
78
53* Enable `PolyKinds` to generalize `Proxy`, `Tagged`, and `Const` instances.
79* Enable `PolyKinds` to generalize `Proxy`, `Tagged`, and `Const` instances.
examples/Generic.hs+7−5
@@ -6,17 +6,19 @@
6-- automatically derive the Generic class for us.
6-- automatically derive the Generic class for us.
7
7
8{-# LANGUAGE DeriveGeneric #-}
8{-# LANGUAGE DeriveGeneric #-}
9−
10{-# LANGUAGE OverloadedStrings #-}
9{-# LANGUAGE OverloadedStrings #-}
11
10
11+module Main (main) where
12+
13+import Prelude ()
14+import Prelude.Compat
15+
12import Data.Aeson (FromJSON, ToJSON, decode, encode)
16import Data.Aeson (FromJSON, ToJSON, decode, encode)
13import qualified Data.ByteString.Lazy.Char8 as BL
17import qualified Data.ByteString.Lazy.Char8 as BL
18+import GHC.Generics (Generic)
14
19
15-- To decode or encode a value using the generic machinery, we must
20-- To decode or encode a value using the generic machinery, we must
16-- make the type an instance of the Generic class.
21-- make the type an instance of the Generic class.
17−
18−import GHC.Generics (Generic)
19−
20data Coord = Coord { x :: Double, y :: Double }
22data Coord = Coord { x :: Double, y :: Double }
21 deriving (Show, Generic)
23 deriving (Show, Generic)
22
24
@@ -31,5 +33,5 @@ main :: IO ()
31main = do
33main = do
32 let req = decode "{\"x\":3.0,\"y\":-1.0}" :: Maybe Coord
34 let req = decode "{\"x\":3.0,\"y\":-1.0}" :: Maybe Coord
33 print req
35 print req
34− let reply = Coord 123.4 20
36+ let reply = Coord { x = 123.4, y = 20 }
35 BL.putStrLn (encode reply)
37 BL.putStrLn (encode reply)
examples/Simplest.hs+8−2
@@ -1,6 +1,12 @@
1−{-# LANGUAGE OverloadedStrings, RecordWildCards #-}
1+{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE RecordWildCards #-}
2
3
4+module Main (main) where
5+
6+import Prelude ()
7+import Prelude.Compat
8+
3−import Control.Applicative ((<$>), (<*>), empty)
9+import Control.Applicative (empty)
4import Data.Aeson
10import Data.Aeson
5import Data.Monoid
11import Data.Monoid
6import qualified Data.ByteString.Lazy.Char8 as BL
12import qualified Data.ByteString.Lazy.Char8 as BL
examples/TemplateHaskell.hs+6−3
@@ -1,10 +1,13 @@
1-- We can use Template Haskell (TH) to generate instances of the
1-- We can use Template Haskell (TH) to generate instances of the
2-- FromJSON and ToJSON classes automatically. This is the fastest way
2-- FromJSON and ToJSON classes automatically. This is the fastest way
3-- to add JSON support for a type.
3-- to add JSON support for a type.
4−
4+{-# LANGUAGE OverloadedStrings #-}
5{-# LANGUAGE TemplateHaskell #-}
5{-# LANGUAGE TemplateHaskell #-}
6
6
7−{-# LANGUAGE OverloadedStrings #-}
7+module Main (main) where
8+
9+import Prelude ()
10+import Prelude.Compat
8
11
9import Data.Aeson (decode, encode)
12import Data.Aeson (decode, encode)
10import Data.Aeson.TH (deriveJSON, defaultOptions)
13import Data.Aeson.TH (deriveJSON, defaultOptions)
@@ -21,5 +24,5 @@ main :: IO ()
21main = do
24main = do
22 let req = decode "{\"x\":3.0,\"y\":-1.0}" :: Maybe Coord
25 let req = decode "{\"x\":3.0,\"y\":-1.0}" :: Maybe Coord
23 print req
26 print req
24− let reply = Coord 123.4 20
27+ let reply = Coord { x = 123.4, y = 20 }
25 BL.putStrLn (encode reply)
28 BL.putStrLn (encode reply)
examples/Twitter.hs+9−5
@@ -8,22 +8,26 @@
8-- renamed "type" to "type_" in the *.json files, to avoid overlap
8-- renamed "type" to "type_" in the *.json files, to avoid overlap
9-- with a Haskell reserved keyword.
9-- with a Haskell reserved keyword.
10
10
11−{-# LANGUAGE DeriveDataTypeable, DeriveGeneric #-}
11+{-# LANGUAGE DeriveDataTypeable #-}
12+{-# LANGUAGE DeriveGeneric #-}
12
13
13−module Twitter (
14+module Twitter
15+ (
14 Metadata(..)
16 Metadata(..)
15 , Geo(..)
17 , Geo(..)
16 , Story(..)
18 , Story(..)
17 , Result(..)
19 , Result(..)
18 ) where
20 ) where
19
21
22+import Prelude ()
23+import Prelude.Compat
24+
25+import Control.DeepSeq
20import Data.Data (Typeable, Data)
26import Data.Data (Typeable, Data)
21import Data.Int (Int64)
27import Data.Int (Int64)
22import Data.Text (Text)
28import Data.Text (Text)
23−-- import Data.Time (ZonedTime)
24import GHC.Generics (Generic)
29import GHC.Generics (Generic)
25import Prelude hiding (id)
30import Prelude hiding (id)
26−import Control.DeepSeq
27
31
28data Metadata = Metadata {
32data Metadata = Metadata {
29 result_type :: Text
33 result_type :: Text
@@ -47,7 +51,7 @@ data Story = Story {
47 , metadata :: Metadata
51 , metadata :: Metadata
48 , to_user_id :: Maybe Int64
52 , to_user_id :: Maybe Int64
49 , text :: Text
53 , text :: Text
50− , id :: Int64
54+ , id_ :: Int64
51 , from_user_id :: Int64
55 , from_user_id :: Int64
52 , geo :: Maybe Geo
56 , geo :: Maybe Geo
53 , iso_language_code :: Text
57 , iso_language_code :: Text
examples/Twitter/Generic.hs+5−2
@@ -1,6 +1,6 @@
1-- Use GHC generics to automatically generate good instances.
1-- Use GHC generics to automatically generate good instances.
2−
2+{-# LANGUAGE CPP #-}
3−{-# LANGUAGE CPP, PackageImports #-}
3+{-# LANGUAGE PackageImports #-}
4{-# OPTIONS_GHC -fno-warn-orphans #-}
4{-# OPTIONS_GHC -fno-warn-orphans #-}
5
5
6module Twitter.Generic
6module Twitter.Generic
@@ -11,6 +11,9 @@ module Twitter.Generic
11 , Result(..)
11 , Result(..)
12 ) where
12 ) where
13
13
14+import Prelude ()
15+import Prelude.Compat
16+
14import Twitter
17import Twitter
15
18
16#ifndef HAS_BOTH_AESON_AND_BENCHMARKS
19#ifndef HAS_BOTH_AESON_AND_BENCHMARKS
examples/Twitter/Manual.hs+11−6
@@ -1,7 +1,9 @@
1-- Manually write instances.
1-- Manually write instances.
2
2
3−{-# LANGUAGE CPP, PackageImports #-}
3+{-# LANGUAGE CPP #-}
4+{-# LANGUAGE PackageImports #-}
4−{-# LANGUAGE OverloadedStrings, RecordWildCards #-}
5+{-# LANGUAGE OverloadedStrings #-}
6+{-# LANGUAGE RecordWildCards #-}
5{-# OPTIONS_GHC -fno-warn-orphans #-}
7{-# OPTIONS_GHC -fno-warn-orphans #-}
6
8
7module Twitter.Manual
9module Twitter.Manual
@@ -12,6 +14,9 @@ module Twitter.Manual
12 , Result(..)
14 , Result(..)
13 ) where
15 ) where
14
16
17+import Prelude ()
18+import Prelude.Compat
19+
15import Control.Applicative
20import Control.Applicative
16import Data.Monoid ((<>))
21import Data.Monoid ((<>))
17import Prelude hiding (id)
22import Prelude hiding (id)
@@ -63,7 +68,7 @@ instance ToJSON Story where
63 , "metadata" .= metadata
68 , "metadata" .= metadata
64 , "to_user_id" .= to_user_id
69 , "to_user_id" .= to_user_id
65 , "text" .= text
70 , "text" .= text
66− , "id" .= id
71+ , "id" .= id_
67 , "from_user_id" .= from_user_id
72 , "from_user_id" .= from_user_id
68 , "geo" .= geo
73 , "geo" .= geo
69 , "iso_language_code" .= iso_language_code
74 , "iso_language_code" .= iso_language_code
@@ -80,7 +85,7 @@ instance ToJSON Story where
80 <> "metadata" .= metadata
85 <> "metadata" .= metadata
81 <> "to_user_id" .= to_user_id
86 <> "to_user_id" .= to_user_id
82 <> "text" .= text
87 <> "text" .= text
83− <> "id" .= id
88+ <> "id" .= id_
84 <> "from_user_id" .= from_user_id
89 <> "from_user_id" .= from_user_id
85 <> "geo" .= geo
90 <> "geo" .= geo
86 <> "iso_language_code" .= iso_language_code
91 <> "iso_language_code" .= iso_language_code
@@ -187,7 +192,7 @@ instance B.ToJSON Story where
187 , "metadata" B..= metadata
192 , "metadata" B..= metadata
188 , "to_user_id" B..= to_user_id
193 , "to_user_id" B..= to_user_id
189 , "text" B..= text
194 , "text" B..= text
190− , "id" B..= id
195+ , "id" B..= id_
191 , "from_user_id" B..= from_user_id
196 , "from_user_id" B..= from_user_id
192 , "geo" B..= geo
197 , "geo" B..= geo
193 , "iso_language_code" B..= iso_language_code
198 , "iso_language_code" B..= iso_language_code
@@ -204,7 +209,7 @@ instance B.ToJSON Story where
204 <> "metadata" B..= metadata
209 <> "metadata" B..= metadata
205 <> "to_user_id" B..= to_user_id
210 <> "to_user_id" B..= to_user_id
206 <> "text" B..= text
211 <> "text" B..= text
207− <> "id" B..= id
212+ <> "id" B..= id_
208 <> "from_user_id" B..= from_user_id
213 <> "from_user_id" B..= from_user_id
209 <> "geo" B..= geo
214 <> "geo" B..= geo
210 <> "iso_language_code" B..= iso_language_code
215 <> "iso_language_code" B..= iso_language_code
examples/Twitter/TH.hs+5−1
@@ -1,6 +1,7 @@
1-- Use Template Haskell to generate good instances.
1-- Use Template Haskell to generate good instances.
2
2
3−{-# LANGUAGE CPP, PackageImports #-}
3+{-# LANGUAGE CPP #-}
4+{-# LANGUAGE PackageImports #-}
4{-# LANGUAGE TemplateHaskell #-}
5{-# LANGUAGE TemplateHaskell #-}
5{-# OPTIONS_GHC -fno-warn-orphans #-}
6{-# OPTIONS_GHC -fno-warn-orphans #-}
6
7
@@ -11,6 +12,9 @@ module Twitter.TH
11 , Story(..)
12 , Story(..)
12 , Result(..)
13 , Result(..)
13 ) where
14 ) where
15+
16+import Prelude ()
17+
14import Twitter
18import Twitter
15
19
16#ifndef HAS_BOTH_AESON_AND_BENCHMARKS
20#ifndef HAS_BOTH_AESON_AND_BENCHMARKS
examples/aeson-examples.cabal+3
@@ -9,6 +9,7 @@ executable aeson-example-generic
9 build-depends:
9 build-depends:
10 aeson >= 0.10,
10 aeson >= 0.10,
11 base,
11 base,
12+ base-compat,
12 bytestring,
13 bytestring,
13 ghc-prim
14 ghc-prim
14
15
@@ -18,6 +19,7 @@ executable aeson-example-simplest
18 build-depends:
19 build-depends:
19 aeson,
20 aeson,
20 base,
21 base,
22+ base-compat,
21 bytestring
23 bytestring
22
24
23executable aeson-example-th
25executable aeson-example-th
@@ -26,4 +28,5 @@ executable aeson-example-th
26 build-depends:
28 build-depends:
27 aeson,
29 aeson,
28 base,
30 base,
31+ base-compat,
29 bytestring
32 bytestring
stack.yaml → stack-lts6.yamlrenamed+4−1
@@ -1,9 +1,12 @@
1−resolver: lts-6.7
1+resolver: lts-6.9
2packages:
2packages:
3- '.'
3- '.'
4- benchmarks
4- benchmarks
5+- examples
5extra-deps:
6extra-deps:
6- semigroups-0.18.2
7- semigroups-0.18.2
7flags:
8flags:
9+ aeson:
10+ fast: true
8 semigroups:
11 semigroups:
9 bytestring-builder: false
12 bytestring-builder: false
stack-nightly.yamlnew file+12
@@ -0,0 +1,12 @@
1+resolver: nightly-2016-07-30
2+packages:
3+- '.'
4+- benchmarks
5+- examples
6+extra-deps:
7+- buffer-builder-0.2.4.3
8+- json-0.9.1
9+- json-builder-0.3
10+flags:
11+ aeson:
12+ fast: true
tests/DataFamilies/Encoders.hs+4−1
@@ -4,10 +4,13 @@
4
4
5module DataFamilies.Encoders where
5module DataFamilies.Encoders where
6
6
7+import Prelude ()
8+import Prelude.Compat
9+
7import Data.Aeson.TH
10import Data.Aeson.TH
8import Data.Aeson.Types
11import Data.Aeson.Types
9−import Options
10import DataFamilies.Types
12import DataFamilies.Types
13+import Options
11
14
12--------------------------------------------------------------------------------
15--------------------------------------------------------------------------------
13-- Nullary encoders/decoders
16-- Nullary encoders/decoders
tests/DataFamilies/Instances.hs+4−3
@@ -4,14 +4,15 @@
4{-# LANGUAGE TypeFamilies #-}
4{-# LANGUAGE TypeFamilies #-}
5{-# OPTIONS_GHC -fno-warn-orphans #-}
5{-# OPTIONS_GHC -fno-warn-orphans #-}
6
6
7−module DataFamilies.Instances where
7+module DataFamilies.Instances () where
8+
9+import Prelude ()
10+import Prelude.Compat
8
11
9−import Control.Applicative
10import Data.Aeson.TH
12import Data.Aeson.TH
11import Data.Aeson.Types (FromJSON(..))
13import Data.Aeson.Types (FromJSON(..))
12import DataFamilies.Types
14import DataFamilies.Types
13import Test.QuickCheck (Arbitrary(..), elements, oneof)
15import Test.QuickCheck (Arbitrary(..), elements, oneof)
14−import Prelude
15
16
16instance (Arbitrary a) => Arbitrary (Approx a) where
17instance (Arbitrary a) => Arbitrary (Approx a) where
17 arbitrary = Approx <$> arbitrary
18 arbitrary = Approx <$> arbitrary
tests/DataFamilies/Properties.hs+3−1
@@ -2,9 +2,11 @@
2
2
3module DataFamilies.Properties (tests) where
3module DataFamilies.Properties (tests) where
4
4
5+import Prelude ()
6+import Prelude.Compat
7+
5import DataFamilies.Encoders
8import DataFamilies.Encoders
6import DataFamilies.Instances ()
9import DataFamilies.Instances ()
7−
8import Properties hiding (tests)
10import Properties hiding (tests)
9
11
10import Test.Framework (Test, testGroup)
12import Test.Framework (Test, testGroup)
tests/DataFamilies/Types.hs+4−1
@@ -1,15 +1,18 @@
1-- DataKinds is needed for deriveAll0 calls on GHC 8
1-- DataKinds is needed for deriveAll0 calls on GHC 8
2{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE DataKinds #-}
3+{-# LANGUAGE DeriveGeneric #-}
3{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE GADTs #-}
5{-# LANGUAGE GADTs #-}
5{-# LANGUAGE GeneralizedNewtypeDeriving #-}
6{-# LANGUAGE GeneralizedNewtypeDeriving #-}
6{-# LANGUAGE StandaloneDeriving #-}
7{-# LANGUAGE StandaloneDeriving #-}
7−{-# LANGUAGE DeriveGeneric #-}
8{-# LANGUAGE TemplateHaskell #-}
8{-# LANGUAGE TemplateHaskell #-}
9{-# LANGUAGE TypeFamilies #-}
9{-# LANGUAGE TypeFamilies #-}
10
10
11module DataFamilies.Types where
11module DataFamilies.Types where
12
12
13+import Prelude ()
14+import Prelude.Compat
15+
13import Generics.Deriving.TH (deriveAll0)
16import Generics.Deriving.TH (deriveAll0)
14import Types (ApproxEq(..))
17import Types (ApproxEq(..))
15
18
tests/Encoders.hs+3
@@ -4,6 +4,9 @@
4
4
5module Encoders where
5module Encoders where
6
6
7+import Prelude ()
8+import Prelude.Compat
9+
7import Data.Aeson.TH
10import Data.Aeson.TH
8import Data.Aeson.Types
11import Data.Aeson.Types
9import Options
12import Options
tests/Functions.hs+8−1
@@ -1,4 +1,11 @@
1−module Functions where
1+module Functions
2+ (
3+ approxEq
4+ , approxEqWith
5+ ) where
6+
7+import Prelude ()
8+import Prelude.Compat
2
9
3approxEq :: (Fractional a, Ord a) => a -> a -> Bool
10approxEq :: (Fractional a, Ord a) => a -> a -> Bool
4approxEq = approxEqWith 1e-15 1e-15
11approxEq = approxEqWith 1e-15 1e-15
tests/Instances.hs+13−14
@@ -1,32 +1,31 @@
1{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
2−{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE FlexibleContexts #-}
2{-# LANGUAGE FlexibleContexts #-}
3+{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE OverloadedStrings #-}
4{-# LANGUAGE OverloadedStrings #-}
5{-# LANGUAGE RecordWildCards #-}
5{-# LANGUAGE RecordWildCards #-}
6{-# LANGUAGE StandaloneDeriving #-}
6{-# LANGUAGE StandaloneDeriving #-}
7{-# OPTIONS_GHC -fno-warn-orphans #-}
7{-# OPTIONS_GHC -fno-warn-orphans #-}
8
8
9−module Instances where
9+module Instances () where
10
10
11import Prelude ()
11import Prelude ()
12import Prelude.Compat
12import Prelude.Compat
13
13
14−import Types
14+import Control.Applicative (Const(..), empty)
15−import Data.Function (on)
16import Control.Monad
15import Control.Monad
17−import Test.QuickCheck (Arbitrary(..), getNonNegative, elements,
18− listOf1, oneof, resize)
19−import Data.Time.Clock (UTCTime(..))
20−import Data.Time (ZonedTime(..), TimeZone(..))
21−import Data.List.NonEmpty (NonEmpty(..))
22−import Data.Version
23import Data.Aeson.Types
16import Data.Aeson.Types
24−import Control.Applicative (Const(..), empty)
17+import Data.Function (on)
25−import Data.Tagged (Tagged(..))
26−import Data.Proxy (Proxy(..))
27−import Data.Functor.Identity (Identity (..))
28import Data.Functor.Compose (Compose (..))
18import Data.Functor.Compose (Compose (..))
19+import Data.Functor.Identity (Identity (..))
20+import Data.List.NonEmpty (NonEmpty(..))
21+import Data.Proxy (Proxy(..))
22+import Data.Tagged (Tagged(..))
23+import Data.Time (ZonedTime(..), TimeZone(..))
24+import Data.Time.Clock (UTCTime(..))
25+import Data.Version
29import Functions
26import Functions
27+import Test.QuickCheck (Arbitrary(..), getNonNegative, elements, listOf1, oneof, resize)
28+import Types
30import qualified Data.DList as DList
29import qualified Data.DList as DList
31import qualified Data.HashMap.Strict as HM
30import qualified Data.HashMap.Strict as HM
32
31
tests/Options.hs+3
@@ -1,5 +1,8 @@
1module Options where
1module Options where
2
2
3+import Prelude ()
4+import Prelude.Compat
5+
3import Data.Aeson.Types
6import Data.Aeson.Types
4import Data.Char
7import Data.Char
5
8
tests/Properties.hs+13−13
@@ -1,7 +1,8 @@
1−{-# LANGUAGE CPP, OverloadedStrings, ScopedTypeVariables, RankNTypes #-}
1+{-# LANGUAGE CPP #-}
2−
2+{-# LANGUAGE FlexibleContexts #-} -- For arbitrary Compose
3−-- For Arbitrary Compose
3+{-# LANGUAGE OverloadedStrings #-}
4−{-# LANGUAGE FlexibleContexts #-}
4+{-# LANGUAGE RankNTypes #-}
5+{-# LANGUAGE ScopedTypeVariables #-}
5
6
6module Properties where
7module Properties where
7
8
@@ -10,23 +11,22 @@ import Prelude.Compat
10
11
11import Control.Applicative (Const)
12import Control.Applicative (Const)
12import Data.Aeson (eitherDecode, encode)
13import Data.Aeson (eitherDecode, encode)
14+import Data.Aeson.Encoding (encodingToLazyByteString)
13import Data.Aeson.Internal (IResult(..), formatError, ifromJSON, iparse)
15import Data.Aeson.Internal (IResult(..), formatError, ifromJSON, iparse)
14import Data.Aeson.Parser (value)
16import Data.Aeson.Parser (value)
15−import Data.Aeson.Encoding (encodingToLazyByteString)
16import Data.Aeson.Types
17import Data.Aeson.Types
17−import Data.Int (Int8)
18−import Data.Sequence (Seq)
19import Data.DList (DList)
18import Data.DList (DList)
20−import Data.Hashable (Hashable)
21−import Data.HashMap.Strict (HashMap)
22import Data.Functor.Compose (Compose (..))
19import Data.Functor.Compose (Compose (..))
23−import Data.Map (Map)
20+import Data.HashMap.Strict (HashMap)
21+import Data.Hashable (Hashable)
24−import Data.Ratio (Ratio)
22+import Data.Int (Int8)
25import Data.List.NonEmpty (NonEmpty)
23import Data.List.NonEmpty (NonEmpty)
26−import Data.Time (Day, LocalTime, NominalDiffTime, TimeOfDay, UTCTime,
24+import Data.Map (Map)
27− ZonedTime)
28import Data.Proxy (Proxy)
25import Data.Proxy (Proxy)
26+import Data.Ratio (Ratio)
27+import Data.Sequence (Seq)
29import Data.Tagged (Tagged)
28import Data.Tagged (Tagged)
29+import Data.Time (Day, LocalTime, NominalDiffTime, TimeOfDay, UTCTime, ZonedTime)
30import Data.Version (Version)
30import Data.Version (Version)
31import Encoders
31import Encoders
32import Instances ()
32import Instances ()
tests/Tests.hs+3
@@ -1,5 +1,8 @@
1module Main (main) where
1module Main (main) where
2
2
3+import Prelude ()
4+import Prelude.Compat
5+
3import Test.Framework (defaultMain)
6import Test.Framework (defaultMain)
4import qualified DataFamilies.Properties as DF
7import qualified DataFamilies.Properties as DF
5import qualified Properties
8import qualified Properties
tests/Types.hs+6−3
@@ -8,13 +8,16 @@
8
8
9module Types where
9module Types where
10
10
11−import qualified Data.Map as Map
11+import Prelude ()
12+import Prelude.Compat
13+
12import Data.Data
14import Data.Data
15+import Data.Functor.Compose (Compose (..))
16+import Data.Functor.Identity (Identity (..))
13import Data.Text
17import Data.Text
14import GHC.Generics
18import GHC.Generics
15import Test.QuickCheck (Property, counterexample)
19import Test.QuickCheck (Property, counterexample)
16−import Data.Functor.Compose (Compose (..))
20+import qualified Data.Map as Map
17−import Data.Functor.Identity (Identity (..))
18
21
19type I = Identity
22type I = Identity
20type Compose3 f g h = Compose (Compose f g) h
23type Compose3 f g h = Compose (Compose f g) h
tests/UnitTests.hs+28−20
@@ -1,54 +1,58 @@
1−{-# LANGUAGE CPP, GADTs, DeriveGeneric, OverloadedStrings, ScopedTypeVariables, TemplateHaskell, GeneralizedNewtypeDeriving #-}
1+{-# LANGUAGE CPP #-}
2+{-# LANGUAGE DeriveGeneric #-}
3+{-# LANGUAGE GADTs #-}
4+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
5+{-# LANGUAGE OverloadedStrings #-}
6+{-# LANGUAGE ScopedTypeVariables #-}
7+{-# LANGUAGE TemplateHaskell #-}
2#if __GLASGOW_HASKELL__ >= 708
8#if __GLASGOW_HASKELL__ >= 708
3{-# LANGUAGE DataKinds #-}
9{-# LANGUAGE DataKinds #-}
4#endif
10#endif
5
11
6{-# OPTIONS_GHC -fno-warn-deprecations #-}
12{-# OPTIONS_GHC -fno-warn-deprecations #-}
7
13
8−module UnitTests (ioTests, tests) where
14+module UnitTests
15+ (
16+ ioTests
17+ , tests
18+ ) where
9
19
10import Prelude ()
20import Prelude ()
11import Prelude.Compat
21import Prelude.Compat
12
22
13−import Types (I, Compose3, Compose3', Approx(..))
14−import Instances ()
15−
16import Control.Applicative (Const(..))
23import Control.Applicative (Const(..))
17import Control.Monad (forM)
24import Control.Monad (forM)
18−import Data.Aeson (FromJSONKeyFunction(..), FromJSONKey(..), decode, eitherDecode, encode, genericParseJSON, genericToJSON, genericToEncoding, object, FromJSON(..), withObject, ToJSON1(..), (.=), (.:), (.:?), (.:!))
25+import Data.Aeson ((.=), (.:), (.:?), (.:!), FromJSON(..), FromJSONKeyFunction(..), FromJSONKey(..), ToJSON1(..), decode, eitherDecode, encode, genericParseJSON, genericToEncoding, genericToJSON, object, withObject)
19−import Data.Aeson.Text (encodeToTextBuilder)
20import Data.Aeson.Internal (JSONPathElement(..), formatError)
26import Data.Aeson.Internal (JSONPathElement(..), formatError)
21import Data.Aeson.TH (deriveJSON, deriveToJSON, deriveToJSON1)
27import Data.Aeson.TH (deriveJSON, deriveToJSON, deriveToJSON1)
28+import Data.Aeson.Text (encodeToTextBuilder)
22−import Data.Aeson.Types (ToJSON(..), Value, camelTo, camelTo2, defaultOptions, omitNothingFields, Options(..), SumEncoding(..))
29+import Data.Aeson.Types (Options(..), SumEncoding(..), ToJSON(..), Value, camelTo, camelTo2, defaultOptions, omitNothingFields)
23import Data.Char (toUpper)
30import Data.Char (toUpper)
24−import Data.Hashable (hash)
31+import Data.Fixed (Pico)
25−import Data.List.NonEmpty (NonEmpty(..))
32+import Data.Functor.Compose (Compose(..))
26−import Data.Functor.Compose (Compose (..))
33+import Data.Functor.Identity (Identity(..))
27import Data.Functor.Product (Product(..))
34import Data.Functor.Product (Product(..))
28import Data.Functor.Sum (Sum(..))
35import Data.Functor.Sum (Sum(..))
29−import Data.Functor.Identity (Identity (..))
36+import Data.Hashable (hash)
37+import Data.List.NonEmpty (NonEmpty(..))
30import Data.Maybe (fromMaybe)
38import Data.Maybe (fromMaybe)
31import Data.Proxy (Proxy(..))
39import Data.Proxy (Proxy(..))
32−import Data.Fixed (Pico)
40+import Data.Scientific (Scientific)
33import Data.Sequence (Seq)
41import Data.Sequence (Seq)
34import Data.Tagged (Tagged(..))
42import Data.Tagged (Tagged(..))
35import Data.Text (Text)
43import Data.Text (Text)
36import Data.Time (UTCTime)
44import Data.Time (UTCTime)
37import Data.Time.Format (parseTime)
45import Data.Time.Format (parseTime)
38import Data.Time.Locale.Compat (defaultTimeLocale)
46import Data.Time.Locale.Compat (defaultTimeLocale)
47+import Data.Word (Word8)
39import GHC.Generics (Generic)
48import GHC.Generics (Generic)
49+import Instances ()
40import Test.Framework (Test, testGroup)
50import Test.Framework (Test, testGroup)
41import Test.Framework.Providers.HUnit (testCase)
51import Test.Framework.Providers.HUnit (testCase)
42import Test.HUnit (Assertion, assertFailure, assertEqual)
52import Test.HUnit (Assertion, assertFailure, assertEqual)
53+import Types (Approx(..), Compose3, Compose3', I)
43import UnitTests.NullaryConstructors (nullaryConstructors)
54import UnitTests.NullaryConstructors (nullaryConstructors)
44−import Data.Word (Word8)
45−import Data.Scientific (Scientific)
46import qualified Data.ByteString.Lazy.Char8 as L
55import qualified Data.ByteString.Lazy.Char8 as L
47−import qualified Data.Text.Lazy.Builder as TLB
48−import qualified Data.Text.Lazy.Encoding as TLE
49−import qualified Data.Text.Lazy as LT
50−import qualified Data.Text.Lazy.Encoding as LT
51−
52import qualified Data.DList as DList
56import qualified Data.DList as DList
53import qualified Data.HashMap.Strict as HM
57import qualified Data.HashMap.Strict as HM
54import qualified Data.HashSet as HashSet
58import qualified Data.HashSet as HashSet
@@ -57,6 +61,10 @@ import qualified Data.IntSet as IntSet
57import qualified Data.Map as M
61import qualified Data.Map as M
58import qualified Data.Sequence as Seq
62import qualified Data.Sequence as Seq
59import qualified Data.Set as Set
63import qualified Data.Set as Set
64+import qualified Data.Text.Lazy as LT
65+import qualified Data.Text.Lazy.Builder as TLB
66+import qualified Data.Text.Lazy.Encoding as LT
67+import qualified Data.Text.Lazy.Encoding as TLE
60import qualified Data.Tree as Tree
68import qualified Data.Tree as Tree
61import qualified Data.Vector as Vector
69import qualified Data.Vector as Vector
62
70
tests/UnitTests/NullaryConstructors.hs+8−2
@@ -2,7 +2,13 @@
2
2
3{-# OPTIONS_GHC -fno-warn-deprecations #-}
3{-# OPTIONS_GHC -fno-warn-deprecations #-}
4
4
5−module UnitTests.NullaryConstructors (nullaryConstructors) where
5+module UnitTests.NullaryConstructors
6+ (
7+ nullaryConstructors
8+ ) where
9+
10+import Prelude ()
11+import Prelude.Compat
6
12
7import Data.Aeson (decode, eitherDecode, fromEncoding, Value)
13import Data.Aeson (decode, eitherDecode, fromEncoding, Value)
8import Data.Aeson.Internal (IResult (..), iparse)
14import Data.Aeson.Internal (IResult (..), iparse)
@@ -10,7 +16,7 @@ import Data.Aeson.Types (Parser)
10import Data.ByteString.Builder (toLazyByteString)
16import Data.ByteString.Builder (toLazyByteString)
11import Data.Maybe (fromJust)
17import Data.Maybe (fromJust)
12import Encoders
18import Encoders
13−import Test.HUnit (Assertion, (@=?))
19+import Test.HUnit ((@=?), Assertion)
14import Types
20import Types
15import qualified Data.ByteString.Lazy.Char8 as L
21import qualified Data.ByteString.Lazy.Char8 as L
16
22