-- 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.4.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

-- | <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 primitives.
class AsNumber t => AsPrimitive t

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

-- | 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.Hashable.Class.Hashable Lens.Micro.Aeson.Primitive
instance GHC.Generics.Generic 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.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
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
