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

-- | Extra goodies for aeson
--   
--   Package provides extra functionality on top of aeson and
--   aeson-compat
@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.
--   
--   
--   λ > decode "null" :: Maybe (CollapsedList [Int] Int)
--   Just (CollapsedList [])
--   λ > decode "42" :: Maybe (CollapsedList [Int] Int)
--   Just (CollapsedList [42])
--   λ > decode "[1, 2, 3]" :: Maybe (CollapsedList [Int] Int)
--   Just (CollapsedList [1,2,3])
--   
--   
--   
--   λ > encode (CollapsedList ([] :: [Int]))
--   "null"
--   λ > encode (CollapsedList ([42] :: [Int]))
--   "42"
--   λ > encode (CollapsedList ([1, 2, 3] :: [Int]))
--   "[1,2,3]"
--   
--   
--   Documentation rely on f Alternative 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.
--   
--   
--   λ > newtype V = V [Int] deriving (Show)
--   λ > instance FromJSON V where parseJSON = withObject "V" $ \obj -> V <$> parseCollapsedList obj "value"
--   λ > decode "{}" :: Maybe V
--   Just (V [])
--   λ > decode "{\"value\": null}" :: Maybe V
--   Just (V [])
--   λ > decode "{\"value\": 42}" :: Maybe V
--   Just (V [42])
--   λ > decode "{\"value\": [1, 2, 3, 4]}" :: Maybe V
--   Just (V [1,2,3,4])
--   
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 Value, for example:
--   
--   
--   stripNulls :: Value -> Value
--   stripNulls = cata (embed . f)
--    where
--      f (ObjectF a) = ObjectF $ HM.filter (== Null) a
--      f x = x
--   
module Data.Aeson.Extra.Recursive

-- | An algebra of Value
--   
--   Since: aeson-extra-0.3.1.0
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).
--   
--   Since: aeson-extra-0.3.1.0
type ObjectF a = HashMap Text a

-- | A JSON "array" (sequence).
--   
--   Since: aeson-extra-0.3.1.0
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 lodashMerge.
--   
--   Since: aeson-extra-0.3.1.0
merge :: (forall a. (a -> a -> a) -> ValueF a -> ValueF a -> ValueF a) -> Value -> Value -> Value

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

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

-- | An algebra of Value
--   
--   Since: aeson-extra-0.3.1.0
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).
--   
--   Since: aeson-extra-0.3.1.0
type ObjectF a = HashMap Text a

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

-- | Deprecated: Use Data.Aeson.Extra.Recursive module
module Data.Aeson.Extra.Foldable

module Data.Aeson.Extra.SingObject

-- | Singleton value object
--   
--   
--   λ > decode "{\"value\": 42 }" :: Maybe (SingObject "value" Int)
--   Just (SingObject 42)
--   
--   
--   
--   λ > encode (SingObject 42 :: SingObject "value" Int)
--   "{\"value\":42}"
--   
--   
--   Available with: base >=4.7
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 ByteString with top-level JSON array.
--   
--   Note: inspecting result's second field will force the list!
--   
--   
--   let ~(values, err) = streamDecode bs
--   traverse_ processValue values
--   maybe (pure ()) printError err
--   
streamDecode :: forall a. FromJSON a => ByteString -> ([a], Maybe String)

module Data.Aeson.Extra.SymTag

-- | Singleton string encoded and decoded as ifself.
--   
--   
--   λ> encode (SymTag :: SymTag "foobar")
--   "\"foobar\""
--   
--   
--   
--   decode "\"foobar\"" :: Maybe (SymTag "foobar")
--   Just SymTag
--   
--   
--   
--   decode "\"foobar\"" :: Maybe (SymTag "barfoo")
--   Nothing
--   
--   
--   Available with: base >=4.7
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 mkValue and mkValue' helpers, this module
--   exports Lift Value orphan instance for aeson <0.11
module Data.Aeson.Extra.TH

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

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

-- | More or less useful newtypes for writing FromJSON &
--   ToJSON instances
module Data.Aeson.Extra

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

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

-- | Singleton value object
--   
--   
--   λ > decode "{\"value\": 42 }" :: Maybe (SingObject "value" Int)
--   Just (SingObject 42)
--   
--   
--   
--   λ > encode (SingObject 42 :: SingObject "value" Int)
--   "{\"value\":42}"
--   
--   
--   Available with: base >=4.7
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.
--   
--   
--   λ > decode "null" :: Maybe (CollapsedList [Int] Int)
--   Just (CollapsedList [])
--   λ > decode "42" :: Maybe (CollapsedList [Int] Int)
--   Just (CollapsedList [42])
--   λ > decode "[1, 2, 3]" :: Maybe (CollapsedList [Int] Int)
--   Just (CollapsedList [1,2,3])
--   
--   
--   
--   λ > encode (CollapsedList ([] :: [Int]))
--   "null"
--   λ > encode (CollapsedList ([42] :: [Int]))
--   "42"
--   λ > encode (CollapsedList ([1, 2, 3] :: [Int]))
--   "[1,2,3]"
--   
--   
--   Documentation rely on f Alternative 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.
--   
--   
--   λ > newtype V = V [Int] deriving (Show)
--   λ > instance FromJSON V where parseJSON = withObject "V" $ \obj -> V <$> parseCollapsedList obj "value"
--   λ > decode "{}" :: Maybe V
--   Just (V [])
--   λ > decode "{\"value\": null}" :: Maybe V
--   Just (V [])
--   λ > decode "{\"value\": 42}" :: Maybe V
--   Just (V [42])
--   λ > decode "{\"value\": [1, 2, 3, 4]}" :: Maybe V
--   Just (V [1,2,3,4])
--   
parseCollapsedList :: (FromJSON a, FromJSON1 f, Alternative f) => Object -> Text -> Parser (f a)

-- | An algebra of Value
--   
--   Since: aeson-extra-0.3.1.0
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).
--   
--   Since: aeson-extra-0.3.1.0
type ObjectF a = HashMap Text a

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

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

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

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

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

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