-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Extra goodies for aeson
--   
--   Package provides extra functionality on top of <tt>aeson</tt> and
--   <tt>aeson-compat</tt>
@package aeson-extra
@version 0.5.1.3


module Data.Aeson.Extra.CollapsedList

-- | Collapsed list, singleton is represented as the value itself in JSON
--   encoding.
--   
--   <pre>
--   λ &gt; decode "null" :: Maybe (CollapsedList [Int] Int)
--   Just (CollapsedList [])
--   λ &gt; decode "42" :: Maybe (CollapsedList [Int] Int)
--   Just (CollapsedList [42])
--   λ &gt; decode "[1, 2, 3]" :: Maybe (CollapsedList [Int] Int)
--   Just (CollapsedList [1,2,3])
--   </pre>
--   
--   <pre>
--   λ &gt; encode (CollapsedList ([] :: [Int]))
--   "null"
--   λ &gt; encode (CollapsedList ([42] :: [Int]))
--   "42"
--   λ &gt; encode (CollapsedList ([1, 2, 3] :: [Int]))
--   "[1,2,3]"
--   </pre>
--   
--   Documentation rely on <tt>f</tt> <a>Alternative</a> instance behaving
--   like lists'.
newtype CollapsedList f a
CollapsedList :: f a -> CollapsedList f a
getCollapsedList :: CollapsedList f a -> f a

-- | Parses possibly collapsed array value from the object's field.
--   
--   <pre>
--   λ &gt; newtype V = V [Int] deriving (Show)
--   λ &gt; instance FromJSON V where parseJSON = withObject "V" $ \obj -&gt; V &lt;$&gt; parseCollapsedList obj "value"
--   λ &gt; decode "{}" :: Maybe V
--   Just (V [])
--   λ &gt; decode "{\"value\": null}" :: Maybe V
--   Just (V [])
--   λ &gt; decode "{\"value\": 42}" :: Maybe V
--   Just (V [42])
--   λ &gt; decode "{\"value\": [1, 2, 3, 4]}" :: Maybe V
--   Just (V [1,2,3,4])
--   </pre>
parseCollapsedList :: (FromJSON a, FromJSON1 f, Alternative f) => Object -> Text -> Parser (f a)
instance Data.Traversable.Traversable f => Data.Traversable.Traversable (Data.Aeson.Extra.CollapsedList.CollapsedList f)
instance Data.Foldable.Foldable f => Data.Foldable.Foldable (Data.Aeson.Extra.CollapsedList.CollapsedList f)
instance GHC.Base.Functor f => GHC.Base.Functor (Data.Aeson.Extra.CollapsedList.CollapsedList f)
instance GHC.Read.Read (f a) => GHC.Read.Read (Data.Aeson.Extra.CollapsedList.CollapsedList f a)
instance GHC.Show.Show (f a) => GHC.Show.Show (Data.Aeson.Extra.CollapsedList.CollapsedList f a)
instance GHC.Classes.Ord (f a) => GHC.Classes.Ord (Data.Aeson.Extra.CollapsedList.CollapsedList f a)
instance GHC.Classes.Eq (f a) => GHC.Classes.Eq (Data.Aeson.Extra.CollapsedList.CollapsedList f a)
instance (Data.Aeson.Types.FromJSON.FromJSON1 f, GHC.Base.Alternative f) => Data.Aeson.Types.FromJSON.FromJSON1 (Data.Aeson.Extra.CollapsedList.CollapsedList f)
instance (Data.Aeson.Types.ToJSON.ToJSON1 f, Data.Foldable.Foldable f) => Data.Aeson.Types.ToJSON.ToJSON1 (Data.Aeson.Extra.CollapsedList.CollapsedList f)
instance (Data.Aeson.Types.ToJSON.ToJSON1 f, Data.Foldable.Foldable f, Data.Aeson.Types.ToJSON.ToJSON a) => Data.Aeson.Types.ToJSON.ToJSON (Data.Aeson.Extra.CollapsedList.CollapsedList f a)
instance (Data.Aeson.Types.FromJSON.FromJSON1 f, GHC.Base.Alternative f, Data.Aeson.Types.FromJSON.FromJSON a) => Data.Aeson.Types.FromJSON.FromJSON (Data.Aeson.Extra.CollapsedList.CollapsedList f a)


-- | Helps writing recursive algorithms on <a>Value</a>, for example:
--   
--   <pre>
--   stripNulls :: Value -&gt; Value
--   stripNulls = <a>cata</a> (<a>embed</a> . f)
--    where
--      f (ObjectF a) = ObjectF $ HM.filter (== Null) a
--      f x = x
--   </pre>
module Data.Aeson.Extra.Recursive

-- | An algebra of <a>Value</a>
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
data ValueF a
ObjectF :: ObjectF a -> ValueF a
ArrayF :: !ArrayF a -> ValueF a
StringF :: !Text -> ValueF a
NumberF :: !Scientific -> ValueF a
BoolF :: !Bool -> ValueF a
NullF :: ValueF a

-- | A JSON "object" (key/value map).
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
type ObjectF a = HashMap Text a

-- | A JSON "array" (sequence).
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
type ArrayF a = Vector a
instance Data.Traversable.Traversable Data.Aeson.Extra.Recursive.ValueF
instance Data.Foldable.Foldable Data.Aeson.Extra.Recursive.ValueF
instance GHC.Base.Functor Data.Aeson.Extra.Recursive.ValueF
instance Data.Data.Data a => Data.Data.Data (Data.Aeson.Extra.Recursive.ValueF a)
instance GHC.Show.Show a => GHC.Show.Show (Data.Aeson.Extra.Recursive.ValueF a)
instance GHC.Read.Read a => GHC.Read.Read (Data.Aeson.Extra.Recursive.ValueF a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Aeson.Extra.Recursive.ValueF a)
instance Data.Functor.Foldable.Recursive Data.Aeson.Types.Internal.Value
instance Data.Functor.Foldable.Corecursive Data.Aeson.Types.Internal.Value


module Data.Aeson.Extra.Merge

-- | Generic merge.
--   
--   For example see <a>lodashMerge</a>.
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
merge :: (forall a. (a -> a -> a) -> ValueF a -> ValueF a -> ValueF a) -> Value -> Value -> Value

-- | Generic merge, in arbitrary context.
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
mergeA :: Functor f => (forall a. (a -> a -> f a) -> ValueF a -> ValueF a -> f (ValueF a)) -> Value -> Value -> f Value

-- | Example of using <a>merge</a>. see
--   <a>https://lodash.com/docs#merge</a>:
--   
--   <i>Note:</i> not tested against JavaScript lodash, so may disagree in
--   the results.
lodashMerge :: Value -> Value -> Value

-- | An algebra of <a>Value</a>
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
data ValueF a
ObjectF :: ObjectF a -> ValueF a
ArrayF :: !ArrayF a -> ValueF a
StringF :: !Text -> ValueF a
NumberF :: !Scientific -> ValueF a
BoolF :: !Bool -> ValueF a
NullF :: ValueF a

-- | A JSON "object" (key/value map).
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
type ObjectF a = HashMap Text a

-- | A JSON "array" (sequence).
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
type ArrayF a = Vector a


-- | <i>Deprecated: Use Data.Aeson.Extra.Recursive module</i>
module Data.Aeson.Extra.Foldable


module Data.Aeson.Extra.SingObject

-- | Singleton value object
--   
--   <pre>
--   λ &gt; decode "{\"value\": 42 }" :: Maybe (SingObject "value" Int)
--   Just (SingObject 42)
--   </pre>
--   
--   <pre>
--   λ &gt; encode (SingObject 42 :: SingObject "value" Int)
--   "{\"value\":42}"
--   </pre>
--   
--   <i>Available with: base &gt;=4.7</i>
newtype SingObject (s :: Symbol) a
SingObject :: a -> SingObject (s :: Symbol) a
mkSingObject :: Proxy s -> a -> SingObject s a
getSingObject :: Proxy s -> SingObject s a -> a
instance Data.Traversable.Traversable (Data.Aeson.Extra.SingObject.SingObject s)
instance Data.Foldable.Foldable (Data.Aeson.Extra.SingObject.SingObject s)
instance GHC.Base.Functor (Data.Aeson.Extra.SingObject.SingObject s)
instance GHC.Read.Read a => GHC.Read.Read (Data.Aeson.Extra.SingObject.SingObject s a)
instance GHC.Show.Show a => GHC.Show.Show (Data.Aeson.Extra.SingObject.SingObject s a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Aeson.Extra.SingObject.SingObject s a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Aeson.Extra.SingObject.SingObject s a)
instance GHC.TypeLits.KnownSymbol s => Data.Aeson.Types.FromJSON.FromJSON1 (Data.Aeson.Extra.SingObject.SingObject s)
instance GHC.TypeLits.KnownSymbol s => Data.Aeson.Types.ToJSON.ToJSON1 (Data.Aeson.Extra.SingObject.SingObject s)
instance (GHC.TypeLits.KnownSymbol s, Data.Aeson.Types.FromJSON.FromJSON a) => Data.Aeson.Types.FromJSON.FromJSON (Data.Aeson.Extra.SingObject.SingObject s a)
instance (GHC.TypeLits.KnownSymbol s, Data.Aeson.Types.ToJSON.ToJSON a) => Data.Aeson.Types.ToJSON.ToJSON (Data.Aeson.Extra.SingObject.SingObject s a)
instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Data.Aeson.Extra.SingObject.SingObject s a)


module Data.Aeson.Extra.Stream

-- | Lazyly parse <a>ByteString</a> with top-level JSON array.
--   
--   <i>Note:</i> inspecting result's second field will force the list!
--   
--   <pre>
--   let ~(values, err) = <a>streamDecode</a> bs
--   traverse_ processValue values
--   maybe (pure ()) printError err
--   </pre>
streamDecode :: forall a. FromJSON a => ByteString -> ([a], Maybe String)


module Data.Aeson.Extra.SymTag

-- | Singleton string encoded and decoded as ifself.
--   
--   <pre>
--   λ&gt; encode (SymTag :: SymTag "foobar")
--   "\"foobar\""
--   </pre>
--   
--   <pre>
--   decode "\"foobar\"" :: Maybe (SymTag "foobar")
--   Just SymTag
--   </pre>
--   
--   <pre>
--   decode "\"foobar\"" :: Maybe (SymTag "barfoo")
--   Nothing
--   </pre>
--   
--   <i>Available with: base &gt;=4.7</i>
data SymTag (s :: Symbol)
SymTag :: SymTag (s :: Symbol)
instance GHC.Enum.Bounded (Data.Aeson.Extra.SymTag.SymTag s)
instance GHC.Enum.Enum (Data.Aeson.Extra.SymTag.SymTag s)
instance GHC.Read.Read (Data.Aeson.Extra.SymTag.SymTag s)
instance GHC.Show.Show (Data.Aeson.Extra.SymTag.SymTag s)
instance GHC.Classes.Ord (Data.Aeson.Extra.SymTag.SymTag s)
instance GHC.Classes.Eq (Data.Aeson.Extra.SymTag.SymTag s)
instance GHC.TypeLits.KnownSymbol s => Data.Aeson.Types.FromJSON.FromJSON (Data.Aeson.Extra.SymTag.SymTag s)
instance GHC.TypeLits.KnownSymbol s => Data.Aeson.Types.ToJSON.ToJSON (Data.Aeson.Extra.SymTag.SymTag s)
instance Control.DeepSeq.NFData (Data.Aeson.Extra.SymTag.SymTag s)


-- | In addition to <a>mkValue</a> and <a>mkValue'</a> helpers, this module
--   exports <tt>Lift</tt> <a>Value</a> orphan instance for aeson &lt;0.11
module Data.Aeson.Extra.TH

-- | Create a <a>Value</a> from string representation.
--   
--   This is useful in tests.
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
mkValue :: String -> Q Exp

-- | Like <a>mkValue</a>, but replace single quotes with double quotes
--   before.
--   
--   <pre>
--   &gt; $(mkValue' "{'a': 2 }")
--   Object (fromList [("a",Number 2.0)])
--   </pre>
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
mkValue' :: String -> Q Exp


-- | More or less useful newtypes for writing <a>FromJSON</a> &amp;
--   <a>ToJSON</a> instances
module Data.Aeson.Extra

-- | Like <a>encode</a>, but produces strict <a>ByteString</a>.
--   
--   <i>Since: 0.2.3.0</i>
encodeStrict :: ToJSON a => a -> ByteString

-- | Singleton string encoded and decoded as ifself.
--   
--   <pre>
--   λ&gt; encode (SymTag :: SymTag "foobar")
--   "\"foobar\""
--   </pre>
--   
--   <pre>
--   decode "\"foobar\"" :: Maybe (SymTag "foobar")
--   Just SymTag
--   </pre>
--   
--   <pre>
--   decode "\"foobar\"" :: Maybe (SymTag "barfoo")
--   Nothing
--   </pre>
--   
--   <i>Available with: base &gt;=4.7</i>
data SymTag (s :: Symbol)
SymTag :: SymTag (s :: Symbol)

-- | Singleton value object
--   
--   <pre>
--   λ &gt; decode "{\"value\": 42 }" :: Maybe (SingObject "value" Int)
--   Just (SingObject 42)
--   </pre>
--   
--   <pre>
--   λ &gt; encode (SingObject 42 :: SingObject "value" Int)
--   "{\"value\":42}"
--   </pre>
--   
--   <i>Available with: base &gt;=4.7</i>
newtype SingObject (s :: Symbol) a
SingObject :: a -> SingObject (s :: Symbol) a
mkSingObject :: Proxy s -> a -> SingObject s a
getSingObject :: Proxy s -> SingObject s a -> a

-- | Collapsed list, singleton is represented as the value itself in JSON
--   encoding.
--   
--   <pre>
--   λ &gt; decode "null" :: Maybe (CollapsedList [Int] Int)
--   Just (CollapsedList [])
--   λ &gt; decode "42" :: Maybe (CollapsedList [Int] Int)
--   Just (CollapsedList [42])
--   λ &gt; decode "[1, 2, 3]" :: Maybe (CollapsedList [Int] Int)
--   Just (CollapsedList [1,2,3])
--   </pre>
--   
--   <pre>
--   λ &gt; encode (CollapsedList ([] :: [Int]))
--   "null"
--   λ &gt; encode (CollapsedList ([42] :: [Int]))
--   "42"
--   λ &gt; encode (CollapsedList ([1, 2, 3] :: [Int]))
--   "[1,2,3]"
--   </pre>
--   
--   Documentation rely on <tt>f</tt> <a>Alternative</a> instance behaving
--   like lists'.
newtype CollapsedList f a
CollapsedList :: f a -> CollapsedList f a
getCollapsedList :: CollapsedList f a -> f a

-- | Parses possibly collapsed array value from the object's field.
--   
--   <pre>
--   λ &gt; newtype V = V [Int] deriving (Show)
--   λ &gt; instance FromJSON V where parseJSON = withObject "V" $ \obj -&gt; V &lt;$&gt; parseCollapsedList obj "value"
--   λ &gt; decode "{}" :: Maybe V
--   Just (V [])
--   λ &gt; decode "{\"value\": null}" :: Maybe V
--   Just (V [])
--   λ &gt; decode "{\"value\": 42}" :: Maybe V
--   Just (V [42])
--   λ &gt; decode "{\"value\": [1, 2, 3, 4]}" :: Maybe V
--   Just (V [1,2,3,4])
--   </pre>
parseCollapsedList :: (FromJSON a, FromJSON1 f, Alternative f) => Object -> Text -> Parser (f a)

-- | An algebra of <a>Value</a>
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
data ValueF a
ObjectF :: ObjectF a -> ValueF a
ArrayF :: !ArrayF a -> ValueF a
StringF :: !Text -> ValueF a
NumberF :: !Scientific -> ValueF a
BoolF :: !Bool -> ValueF a
NullF :: ValueF a

-- | A JSON "object" (key/value map).
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
type ObjectF a = HashMap Text a

-- | A JSON "array" (sequence).
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
type ArrayF a = Vector a

-- | Generic merge.
--   
--   For example see <a>lodashMerge</a>.
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
merge :: (forall a. (a -> a -> a) -> ValueF a -> ValueF a -> ValueF a) -> Value -> Value -> Value

-- | Example of using <a>merge</a>. see
--   <a>https://lodash.com/docs#merge</a>:
--   
--   <i>Note:</i> not tested against JavaScript lodash, so may disagree in
--   the results.
lodashMerge :: Value -> Value -> Value

-- | Lazyly parse <a>ByteString</a> with top-level JSON array.
--   
--   <i>Note:</i> inspecting result's second field will force the list!
--   
--   <pre>
--   let ~(values, err) = <a>streamDecode</a> bs
--   traverse_ processValue values
--   maybe (pure ()) printError err
--   </pre>
streamDecode :: forall a. FromJSON a => ByteString -> ([a], Maybe String)

-- | Create a <a>Value</a> from string representation.
--   
--   This is useful in tests.
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
mkValue :: String -> Q Exp

-- | Like <a>mkValue</a>, but replace single quotes with double quotes
--   before.
--   
--   <pre>
--   &gt; $(mkValue' "{'a': 2 }")
--   Object (fromList [("a",Number 2.0)])
--   </pre>
--   
--   <i>Since: aeson-extra-0.3.1.0</i>
mkValue' :: String -> Q Exp
