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


-- | Law-abiding lenses for Aeson, using microlens.
--   
--   Law-abiding lenses for Aeson, using microlens.
@package microlens-aeson
@version 2.2.0.1


-- | Traversals for Data.Aeson, based on microlens for minimal
--   dependencies.
--   
--   For basic manipulation of Aeson values, full <tt>Prism</tt>
--   functionality isn't necessary. Since all Prisms are inherently
--   Traversals, we provide Traversals that mimic the behaviour of the
--   Prisms found in the original Data.Aeson.Lens.
module Lens.Micro.Aeson

-- | Traverse into various number types.
class AsNumber t where _Number = _Primitive . _Number _Double = _Number . lens toRealFloat (const realToFrac) _Integer = _Number . lens floor (const fromIntegral)

-- | <pre>
--   &gt;&gt;&gt; "[1, \"x\"]" ^? nth 0 . _Number
--   Just 1.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "[1, \"x\"]" ^? nth 1 . _Number
--   Nothing
--   </pre>
_Number :: AsNumber t => Traversal' t Scientific

-- | <pre>
--   &gt;&gt;&gt; "[1, \"x\"]" ^? nth 0 . _Number
--   Just 1.0
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "[1, \"x\"]" ^? nth 1 . _Number
--   Nothing
--   </pre>
_Number :: (AsNumber t, AsPrimitive t) => Traversal' t Scientific

-- | Traversal into an <a>Double</a> over a <a>Value</a>, <a>Primitive</a>
--   or <a>Scientific</a>
--   
--   <pre>
--   &gt;&gt;&gt; "[10.2]" ^? nth 0 . _Double
--   Just 10.2
--   </pre>
_Double :: AsNumber t => Traversal' t Double

-- | Traversal into an <a>Integer</a> over a <a>Value</a>, <a>Primitive</a>
--   or <a>Scientific</a>
--   
--   <pre>
--   &gt;&gt;&gt; "[10]" ^? nth 0 . _Integer
--   Just 10
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "[10.5]" ^? nth 0 . _Integer
--   Just 10
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "42" ^? _Integer
--   Just 42
--   </pre>
_Integer :: AsNumber t => Traversal' t Integer

-- | Access Integer <a>Value</a>s as Integrals.
--   
--   <pre>
--   &gt;&gt;&gt; "[10]" ^? nth 0 . _Integral
--   Just 10
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "[10.5]" ^? nth 0 . _Integral
--   Just 10
--   </pre>
_Integral :: (AsNumber t, Integral a) => Traversal' t a

-- | Traversal into non-<a>Null</a> values
--   
--   <pre>
--   &gt;&gt;&gt; "{\"a\": \"xyz\", \"b\": null}" ^? key "a" . nonNull
--   Just (String "xyz")
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "{\"a\": {}, \"b\": null}" ^? key "a" . nonNull
--   Just (Object (fromList []))
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "{\"a\": \"xyz\", \"b\": null}" ^? key "b" . nonNull
--   Nothing
--   </pre>
nonNull :: Traversal' Value Value

-- | Primitives of <a>Value</a>
data Primitive
StringPrim :: !Text -> Primitive
NumberPrim :: !Scientific -> Primitive
BoolPrim :: !Bool -> Primitive
NullPrim :: Primitive

-- | Traverse into various JSON primatives.
class AsNumber t => AsPrimitive t where _Primitive = _Value . _Primitive _String = _Primitive . trav where trav f (StringPrim s) = StringPrim <$> f s trav _ x = pure x _Bool = _Primitive . trav where trav f (BoolPrim b) = BoolPrim <$> f b trav _ x = pure x _Null = _Primitive . trav where trav f NullPrim = const NullPrim <$> f () trav _ x = pure x

-- | <pre>
--   &gt;&gt;&gt; "[1, \"x\", null, true, false]" ^? nth 0 . _Primitive
--   Just (NumberPrim 1.0)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "[1, \"x\", null, true, false]" ^? nth 1 . _Primitive
--   Just (StringPrim "x")
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "[1, \"x\", null, true, false]" ^? nth 2 . _Primitive
--   Just NullPrim
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "[1, \"x\", null, true, false]" ^? nth 3 . _Primitive
--   Just (BoolPrim True)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "[1, \"x\", null, true, false]" ^? nth 4 . _Primitive
--   Just (BoolPrim False)
--   </pre>
_Primitive :: AsPrimitive t => Traversal' t Primitive

-- | <pre>
--   &gt;&gt;&gt; "[1, \"x\", null, true, false]" ^? nth 0 . _Primitive
--   Just (NumberPrim 1.0)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "[1, \"x\", null, true, false]" ^? nth 1 . _Primitive
--   Just (StringPrim "x")
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "[1, \"x\", null, true, false]" ^? nth 2 . _Primitive
--   Just NullPrim
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "[1, \"x\", null, true, false]" ^? nth 3 . _Primitive
--   Just (BoolPrim True)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "[1, \"x\", null, true, false]" ^? nth 4 . _Primitive
--   Just (BoolPrim False)
--   </pre>
_Primitive :: (AsPrimitive t, AsValue t) => Traversal' t Primitive

-- | <pre>
--   &gt;&gt;&gt; "{\"a\": \"xyz\", \"b\": true}" ^? key "a" . _String
--   Just "xyz"
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "{\"a\": \"xyz\", \"b\": true}" ^? key "b" . _String
--   Nothing
--   </pre>
_String :: AsPrimitive t => Traversal' t Text

-- | <pre>
--   &gt;&gt;&gt; "{\"a\": \"xyz\", \"b\": true}" ^? key "b" . _Bool
--   Just True
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "{\"a\": \"xyz\", \"b\": true}" ^? key "a" . _Bool
--   Nothing
--   </pre>
_Bool :: AsPrimitive t => Traversal' t Bool

-- | <pre>
--   &gt;&gt;&gt; "{\"a\": \"xyz\", \"b\": null}" ^? key "b" . _Null
--   Just ()
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "{\"a\": \"xyz\", \"b\": null}" ^? key "a" . _Null
--   Nothing
--   </pre>
_Null :: AsPrimitive t => Traversal' t ()

-- | Traverse into JSON Objects and Arrays.
class AsPrimitive t => AsValue t where _Object = _Value . trav where trav f (Object o) = Object <$> f o trav _ v = pure v _Array = _Value . trav where trav f (Array a) = Array <$> f a trav _ v = pure v

-- | Traverse into data that encodes a <a>Value</a>
_Value :: AsValue t => Traversal' t Value

-- | <pre>
--   &gt;&gt;&gt; "{\"a\": {}, \"b\": null}" ^? key "a" . _Object
--   Just (fromList [])
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "{\"a\": {}, \"b\": null}" ^? key "b" . _Object
--   Nothing
--   </pre>
_Object :: AsValue t => Traversal' t (HashMap Text Value)
_Array :: AsValue t => Traversal' t (Vector Value)

-- | Like <a>ix</a>, but for <a>Object</a> with Text indices. This often
--   has better inference than <a>ix</a> when used with OverloadedStrings.
--   
--   <pre>
--   &gt;&gt;&gt; "{\"a\": 100, \"b\": 200}" ^? key "a"
--   Just (Number 100.0)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "[1,2,3]" ^? key "a"
--   Nothing
--   </pre>
key :: AsValue t => Text -> Traversal' t Value

-- | A Traversal into Object properties
--   
--   <pre>
--   &gt;&gt;&gt; "{\"a\": 4, \"b\": 7}" ^.. members
--   [Number 4.0,Number 7.0]
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "{\"a\": 4, \"b\": 7}" &amp; members . _Number %~ (* 10)
--   "{\"a\":40,\"b\":70}"
--   </pre>
members :: AsValue t => Traversal' t Value

-- | Like <a>ix</a>, but for Arrays with Int indexes
--   
--   <pre>
--   &gt;&gt;&gt; "[1,2,3]" ^? nth 1
--   Just (Number 2.0)
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "{\"a\": 100, \"b\": 200}" ^? nth 1
--   Nothing
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "[1,2,3]" &amp; nth 1 .~ Number 20
--   "[1,20,3]"
--   </pre>
nth :: AsValue t => Int -> Traversal' t Value

-- | A Traversal into Array elements
--   
--   <pre>
--   &gt;&gt;&gt; "[1,2,3]" ^.. values
--   [Number 1.0,Number 2.0,Number 3.0]
--   </pre>
--   
--   <pre>
--   &gt;&gt;&gt; "[1,2,3]" &amp; values . _Number %~ (* 10)
--   "[10,20,30]"
--   </pre>
values :: AsValue t => Traversal' t Value

-- | Traverse into actual encoded JSON.
class AsJSON t

-- | <a>_JSON</a> is a <a>Traversal</a> from something containing JSON to
--   something encoded in that structure.
_JSON :: (AsJSON t, FromJSON a, ToJSON a) => Traversal' t a
instance Data.Data.Data Lens.Micro.Aeson.Primitive
instance GHC.Show.Show Lens.Micro.Aeson.Primitive
instance GHC.Classes.Ord Lens.Micro.Aeson.Primitive
instance GHC.Classes.Eq Lens.Micro.Aeson.Primitive
instance Lens.Micro.Aeson.AsNumber Data.Aeson.Types.Internal.Value
instance Lens.Micro.Aeson.AsNumber Data.Scientific.Scientific
instance Lens.Micro.Aeson.AsNumber Data.ByteString.Internal.ByteString
instance Lens.Micro.Aeson.AsNumber Data.ByteString.Lazy.Internal.ByteString
instance Lens.Micro.Aeson.AsNumber Data.Text.Internal.Text
instance Lens.Micro.Aeson.AsNumber Data.Text.Internal.Lazy.Text
instance Lens.Micro.Aeson.AsNumber GHC.Base.String
instance Lens.Micro.Aeson.AsNumber Lens.Micro.Aeson.Primitive
instance Lens.Micro.Aeson.AsPrimitive Data.Aeson.Types.Internal.Value
instance Lens.Micro.Aeson.AsPrimitive Data.ByteString.Internal.ByteString
instance Lens.Micro.Aeson.AsPrimitive Data.ByteString.Lazy.Internal.ByteString
instance Lens.Micro.Aeson.AsPrimitive Data.Text.Internal.Text
instance Lens.Micro.Aeson.AsPrimitive Data.Text.Internal.Lazy.Text
instance Lens.Micro.Aeson.AsPrimitive GHC.Base.String
instance Lens.Micro.Aeson.AsPrimitive Lens.Micro.Aeson.Primitive
instance Lens.Micro.Aeson.AsValue Data.Aeson.Types.Internal.Value
instance Lens.Micro.Aeson.AsValue Data.ByteString.Internal.ByteString
instance Lens.Micro.Aeson.AsValue Data.ByteString.Lazy.Internal.ByteString
instance Lens.Micro.Aeson.AsValue GHC.Base.String
instance Lens.Micro.Aeson.AsValue Data.Text.Internal.Text
instance Lens.Micro.Aeson.AsValue Data.Text.Internal.Lazy.Text
instance Lens.Micro.Aeson.AsJSON Data.ByteString.Internal.ByteString
instance Lens.Micro.Aeson.AsJSON Data.ByteString.Lazy.Internal.ByteString
instance Lens.Micro.Aeson.AsJSON GHC.Base.String
instance Lens.Micro.Aeson.AsJSON Data.Text.Internal.Text
instance Lens.Micro.Aeson.AsJSON Data.Text.Internal.Lazy.Text
instance Lens.Micro.Aeson.AsJSON Data.Aeson.Types.Internal.Value
