{-# LANGUAGE BangPatterns          #-}
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE InstanceSigs          #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings     #-}
{-# LANGUAGE ScopedTypeVariables   #-}

module HaskellWorks.Data.Json.LightJson where

import Control.Arrow
import Control.Monad
import Data.String
import Data.Text                                      (Text)
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Drop
import HaskellWorks.Data.Json.Internal.CharLike
import HaskellWorks.Data.Json.Internal.Doc
import HaskellWorks.Data.Json.Internal.Slurp
import HaskellWorks.Data.Json.Standard.Cursor.Generic
import HaskellWorks.Data.MQuery
import HaskellWorks.Data.MQuery.AtLeastSize
import HaskellWorks.Data.MQuery.Entry
import HaskellWorks.Data.MQuery.Micro
import HaskellWorks.Data.MQuery.Mini
import HaskellWorks.Data.MQuery.Row
import HaskellWorks.Data.Positioning
import HaskellWorks.Data.RankSelect.Base.Rank0
import HaskellWorks.Data.RankSelect.Base.Rank1
import HaskellWorks.Data.RankSelect.Base.Select1
import HaskellWorks.Data.TreeCursor
import HaskellWorks.Data.Uncons
import Prelude                                        hiding (drop)
import Prettyprinter

import qualified Data.ByteString                      as BS
import qualified Data.ByteString.Unsafe               as BSU
import qualified Data.List                            as L
import qualified Data.Text                            as T
import qualified HaskellWorks.Data.BalancedParens     as BP
import qualified HaskellWorks.Data.Json.Simple.Cursor as JSC

data LightJson c
  = LightJsonString Text
  | LightJsonNumber BS.ByteString
  | LightJsonObject [(Text, c)]
  | LightJsonArray [c]
  | LightJsonBool Bool
  | LightJsonNull
  | LightJsonError Text
  deriving Int -> LightJson c -> ShowS
[LightJson c] -> ShowS
LightJson c -> String
(Int -> LightJson c -> ShowS)
-> (LightJson c -> String)
-> ([LightJson c] -> ShowS)
-> Show (LightJson c)
forall c. Show c => Int -> LightJson c -> ShowS
forall c. Show c => [LightJson c] -> ShowS
forall c. Show c => LightJson c -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall c. Show c => Int -> LightJson c -> ShowS
showsPrec :: Int -> LightJson c -> ShowS
$cshow :: forall c. Show c => LightJson c -> String
show :: LightJson c -> String
$cshowList :: forall c. Show c => [LightJson c] -> ShowS
showList :: [LightJson c] -> ShowS
Show

instance LightJsonAt c => Eq (LightJson c) where
  == :: LightJson c -> LightJson c -> Bool
(==) (LightJsonString Text
a) (LightJsonString Text
b) = Text
a Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
b
  (==) (LightJsonNumber ByteString
a) (LightJsonNumber ByteString
b) = ByteString
a ByteString -> ByteString -> Bool
forall a. Eq a => a -> a -> Bool
== ByteString
b
  (==) (LightJsonBool   Bool
a) (LightJsonBool   Bool
b) = Bool
a Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
b
  (==) (LightJsonObject [(Text, c)]
a) (LightJsonObject [(Text, c)]
b) = ((Text, c) -> (Text, LightJson c))
-> [(Text, c)] -> [(Text, LightJson c)]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((c -> LightJson c) -> (Text, c) -> (Text, LightJson c)
forall a b. (a -> b) -> (Text, a) -> (Text, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap c -> LightJson c
forall a. LightJsonAt a => a -> LightJson a
lightJsonAt) [(Text, c)]
a [(Text, LightJson c)] -> [(Text, LightJson c)] -> Bool
forall a. Eq a => a -> a -> Bool
== ((Text, c) -> (Text, LightJson c))
-> [(Text, c)] -> [(Text, LightJson c)]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((c -> LightJson c) -> (Text, c) -> (Text, LightJson c)
forall a b. (a -> b) -> (Text, a) -> (Text, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap c -> LightJson c
forall a. LightJsonAt a => a -> LightJson a
lightJsonAt) [(Text, c)]
b
  (==) (LightJsonArray  [c]
a) (LightJsonArray  [c]
b) = (c -> LightJson c) -> [c] -> [LightJson c]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap c -> LightJson c
forall a. LightJsonAt a => a -> LightJson a
lightJsonAt [c]
a [LightJson c] -> [LightJson c] -> Bool
forall a. Eq a => a -> a -> Bool
== (c -> LightJson c) -> [c] -> [LightJson c]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap c -> LightJson c
forall a. LightJsonAt a => a -> LightJson a
lightJsonAt [c]
b
  (==)  LightJson c
LightJsonNull       LightJson c
LightJsonNull      = Bool
True
  (==) (LightJsonError  Text
a) (LightJsonError  Text
b) = Text
a Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
b
  (==)  LightJson c
_                   LightJson c
_                  = Bool
False

data LightJsonField c = LightJsonField Text (LightJson c)

class LightJsonAt a where
  lightJsonAt :: a -> LightJson a

instance LightJsonAt c => Pretty (LightJsonField c) where
  pretty :: forall ann. LightJsonField c -> Doc ann
pretty (LightJsonField Text
k LightJson c
v) = String -> Doc ann
forall a. String -> Doc a
text (Text -> String
forall a. Show a => a -> String
show Text
k) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall a. String -> Doc a
text String
": " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> LightJson c -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. LightJson c -> Doc ann
pretty LightJson c
v

instance LightJsonAt c => Pretty (LightJson c) where
  pretty :: forall ann. LightJson c -> Doc ann
pretty LightJson c
c = case LightJson c
c of
    LightJsonString Text
s   -> Doc ann -> Doc ann
forall a. Doc a -> Doc a
dullgreen  (String -> Doc ann
forall a. String -> Doc a
text (Text -> String
forall a. Show a => a -> String
show Text
s))
    LightJsonNumber ByteString
n   -> Doc ann -> Doc ann
forall a. Doc a -> Doc a
cyan       (String -> Doc ann
forall a. String -> Doc a
text (ByteString -> String
forall a. Show a => a -> String
show ByteString
n))
    LightJsonObject []  -> String -> Doc ann
forall a. String -> Doc a
text String
"{}"
    LightJsonObject [(Text, c)]
kvs -> Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
forall a. Doc a -> Doc a -> Doc a -> [Doc a] -> Doc a
hEncloseSep (String -> Doc ann
forall a. String -> Doc a
text String
"{") (String -> Doc ann
forall a. String -> Doc a
text String
"}") (String -> Doc ann
forall a. String -> Doc a
text String
",") ((LightJsonField c -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. LightJsonField c -> Doc ann
pretty (LightJsonField c -> Doc ann)
-> ((Text, c) -> LightJsonField c) -> (Text, c) -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text, LightJson c) -> LightJsonField c
toLightJsonField ((Text, LightJson c) -> LightJsonField c)
-> ((Text, c) -> (Text, LightJson c))
-> (Text, c)
-> LightJsonField c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (c -> LightJson c) -> (Text, c) -> (Text, LightJson c)
forall b c d. (b -> c) -> (d, b) -> (d, c)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second c -> LightJson c
forall a. LightJsonAt a => a -> LightJson a
lightJsonAt) ((Text, c) -> Doc ann) -> [(Text, c)] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
`map` [(Text, c)]
kvs)
    LightJsonArray [c]
vs   -> Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
forall a. Doc a -> Doc a -> Doc a -> [Doc a] -> Doc a
hEncloseSep (String -> Doc ann
forall a. String -> Doc a
text String
"[") (String -> Doc ann
forall a. String -> Doc a
text String
"]") (String -> Doc ann
forall a. String -> Doc a
text String
",") ((LightJson c -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. LightJson c -> Doc ann
pretty (LightJson c -> Doc ann) -> (c -> LightJson c) -> c -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> LightJson c
forall a. LightJsonAt a => a -> LightJson a
lightJsonAt) (c -> Doc ann) -> [c] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
`map` [c]
vs)
    LightJsonBool Bool
w     -> Doc ann -> Doc ann
forall a. Doc a -> Doc a
red (String -> Doc ann
forall a. String -> Doc a
text (Bool -> String
forall a. Show a => a -> String
show Bool
w))
    LightJson c
LightJsonNull       -> String -> Doc ann
forall a. String -> Doc a
text String
"null"
    LightJsonError Text
s    -> String -> Doc ann
forall a. String -> Doc a
text String
"<error " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall a. String -> Doc a
text (Text -> String
T.unpack Text
s) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall a. String -> Doc a
text String
">"
    where toLightJsonField :: (Text, LightJson c) -> LightJsonField c
          toLightJsonField :: (Text, LightJson c) -> LightJsonField c
toLightJsonField (Text
k, LightJson c
v) = Text -> LightJson c -> LightJsonField c
forall c. Text -> LightJson c -> LightJsonField c
LightJsonField Text
k LightJson c
v

instance Pretty (Micro (LightJson c)) where
  pretty :: forall ann. Micro (LightJson c) -> Doc ann
pretty (Micro (LightJsonString Text
s )) = Doc ann -> Doc ann
forall a. Doc a -> Doc a
dullgreen (String -> Doc ann
forall a. String -> Doc a
text (Text -> String
forall a. Show a => a -> String
show Text
s))
  pretty (Micro (LightJsonNumber ByteString
n )) = Doc ann -> Doc ann
forall a. Doc a -> Doc a
cyan      (String -> Doc ann
forall a. String -> Doc a
text (ByteString -> String
forall a. Show a => a -> String
show ByteString
n))
  pretty (Micro (LightJsonObject [])) = String -> Doc ann
forall a. String -> Doc a
text String
"{}"
  pretty (Micro (LightJsonObject [(Text, c)]
_ )) = String -> Doc ann
forall a. String -> Doc a
text String
"{..}"
  pretty (Micro (LightJsonArray [] )) = String -> Doc ann
forall a. String -> Doc a
text String
"[]"
  pretty (Micro (LightJsonArray [c]
_  )) = String -> Doc ann
forall a. String -> Doc a
text String
"[..]"
  pretty (Micro (LightJsonBool Bool
w   )) = Doc ann -> Doc ann
forall a. Doc a -> Doc a
red (String -> Doc ann
forall a. String -> Doc a
text (Bool -> String
forall a. Show a => a -> String
show Bool
w))
  pretty (Micro  LightJson c
LightJsonNull      ) = String -> Doc ann
forall a. String -> Doc a
text String
"null"
  pretty (Micro (LightJsonError Text
s  )) = String -> Doc ann
forall a. String -> Doc a
text String
"<error " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall a. String -> Doc a
text (Text -> String
T.unpack Text
s) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall a. String -> Doc a
text String
">"

instance Pretty (Micro (String, LightJson c)) where
  pretty :: forall ann. Micro (String, LightJson c) -> Doc ann
pretty (Micro (String
fieldName, LightJson c
jpv)) = Doc ann -> Doc ann
forall a. Doc a -> Doc a
red (String -> Doc ann
forall a. String -> Doc a
text (ShowS
forall a. Show a => a -> String
show String
fieldName)) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall a. String -> Doc a
text String
": " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Micro (LightJson c) -> Doc ann
forall ann. Micro (LightJson c) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (LightJson c -> Micro (LightJson c)
forall a. a -> Micro a
Micro LightJson c
jpv)

instance Pretty (Micro (Text, LightJson c)) where
  pretty :: forall ann. Micro (Text, LightJson c) -> Doc ann
pretty (Micro (Text
fieldName, LightJson c
jpv)) = Doc ann -> Doc ann
forall a. Doc a -> Doc a
red (String -> Doc ann
forall a. String -> Doc a
text (Text -> String
forall a. Show a => a -> String
show Text
fieldName)) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall a. String -> Doc a
text String
": " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Micro (LightJson c) -> Doc ann
forall ann. Micro (LightJson c) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (LightJson c -> Micro (LightJson c)
forall a. a -> Micro a
Micro LightJson c
jpv)

instance LightJsonAt c => Pretty (Mini (LightJson c)) where
  pretty :: forall ann. Mini (LightJson c) -> Doc ann
pretty Mini (LightJson c)
mjpv = case Mini (LightJson c)
mjpv of
    Mini (LightJsonString Text
s   ) -> Doc ann -> Doc ann
forall a. Doc a -> Doc a
dullgreen  (String -> Doc ann
forall a. String -> Doc a
text (Text -> String
forall a. Show a => a -> String
show Text
s))
    Mini (LightJsonNumber ByteString
n   ) -> Doc ann -> Doc ann
forall a. Doc a -> Doc a
cyan       (String -> Doc ann
forall a. String -> Doc a
text (ByteString -> String
forall a. Show a => a -> String
show ByteString
n))
    Mini (LightJsonObject []  ) -> String -> Doc ann
forall a. String -> Doc a
text String
"{}"
    Mini (LightJsonObject [(Text, c)]
kvs ) -> case [(Text, c)]
kvs of
      ((Text, c)
_:(Text, c)
_:(Text, c)
_:(Text, c)
_:(Text, c)
_:(Text, c)
_:(Text, c)
_:(Text, c)
_:(Text, c)
_:(Text, c)
_:(Text, c)
_:(Text, c)
_:[(Text, c)]
_) -> String -> Doc ann
forall a. String -> Doc a
text String
"{" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> [(Text, LightJson c)] -> Doc ann
forall a ann. Pretty (Micro a) => [a] -> Doc ann
prettyKvs (((Text, c) -> (Text, LightJson c))
-> [(Text, c)] -> [(Text, LightJson c)]
forall a b. (a -> b) -> [a] -> [b]
map ((c -> LightJson c) -> (Text, c) -> (Text, LightJson c)
forall b c d. (b -> c) -> (d, b) -> (d, c)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second c -> LightJson c
forall a. LightJsonAt a => a -> LightJson a
lightJsonAt) [(Text, c)]
kvs) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall a. String -> Doc a
text String
", ..}"
      []                          -> String -> Doc ann
forall a. String -> Doc a
text String
"{}"
      [(Text, c)]
_                           -> String -> Doc ann
forall a. String -> Doc a
text String
"{" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> [(Text, LightJson c)] -> Doc ann
forall a ann. Pretty (Micro a) => [a] -> Doc ann
prettyKvs (((Text, c) -> (Text, LightJson c))
-> [(Text, c)] -> [(Text, LightJson c)]
forall a b. (a -> b) -> [a] -> [b]
map ((c -> LightJson c) -> (Text, c) -> (Text, LightJson c)
forall b c d. (b -> c) -> (d, b) -> (d, c)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second c -> LightJson c
forall a. LightJsonAt a => a -> LightJson a
lightJsonAt) [(Text, c)]
kvs) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall a. String -> Doc a
text String
"}"
    Mini (LightJsonArray []   ) -> String -> Doc ann
forall a. String -> Doc a
text String
"[]"
    Mini (LightJsonArray [c]
vs   ) | [c]
vs [c] -> Int -> Bool
forall a. AtLeastSize a => a -> Int -> Bool
`atLeastSize` Int
11 -> String -> Doc ann
forall a. String -> Doc a
text String
"[" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
nest Int
2 ([Micro (LightJson c)] -> Doc ann
forall a ann. Pretty a => [a] -> Doc ann
prettyVs ((LightJson c -> Micro (LightJson c)
forall a. a -> Micro a
Micro (LightJson c -> Micro (LightJson c))
-> (c -> LightJson c) -> c -> Micro (LightJson c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> LightJson c
forall a. LightJsonAt a => a -> LightJson a
lightJsonAt) (c -> Micro (LightJson c)) -> [c] -> [Micro (LightJson c)]
forall a b. (a -> b) -> [a] -> [b]
`map` Int -> [c] -> [c]
forall a. Int -> [a] -> [a]
take Int
10 [c]
vs)) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall a. String -> Doc a
text String
", ..]"
    Mini (LightJsonArray [c]
vs   ) | [c]
vs [c] -> Int -> Bool
forall a. AtLeastSize a => a -> Int -> Bool
`atLeastSize` Int
1  -> String -> Doc ann
forall a. String -> Doc a
text String
"[" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
nest Int
2 ([Micro (LightJson c)] -> Doc ann
forall a ann. Pretty a => [a] -> Doc ann
prettyVs ((LightJson c -> Micro (LightJson c)
forall a. a -> Micro a
Micro (LightJson c -> Micro (LightJson c))
-> (c -> LightJson c) -> c -> Micro (LightJson c)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. c -> LightJson c
forall a. LightJsonAt a => a -> LightJson a
lightJsonAt) (c -> Micro (LightJson c)) -> [c] -> [Micro (LightJson c)]
forall a b. (a -> b) -> [a] -> [b]
`map` Int -> [c] -> [c]
forall a. Int -> [a] -> [a]
take Int
10 [c]
vs)) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall a. String -> Doc a
text String
"]"
    Mini (LightJsonArray [c]
_    )                       -> String -> Doc ann
forall a. String -> Doc a
text String
"[]"
    Mini (LightJsonBool Bool
w     ) -> Doc ann -> Doc ann
forall a. Doc a -> Doc a
red (String -> Doc ann
forall a. String -> Doc a
text (Bool -> String
forall a. Show a => a -> String
show Bool
w))
    Mini  LightJson c
LightJsonNull         -> String -> Doc ann
forall a. String -> Doc a
text String
"null"
    Mini (LightJsonError Text
s    ) -> String -> Doc ann
forall a. String -> Doc a
text String
"<error " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall a. String -> Doc a
text (Text -> String
T.unpack Text
s) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall a. String -> Doc a
text String
">"

instance LightJsonAt c => Pretty (Mini (String, LightJson c)) where
  pretty :: forall ann. Mini (String, LightJson c) -> Doc ann
pretty (Mini (String
fieldName, LightJson c
jpv)) = String -> Doc ann
forall a. String -> Doc a
text (ShowS
forall a. Show a => a -> String
show String
fieldName) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall a. String -> Doc a
text String
": " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Mini (LightJson c) -> Doc ann
forall ann. Mini (LightJson c) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (LightJson c -> Mini (LightJson c)
forall a. a -> Mini a
Mini LightJson c
jpv)

instance LightJsonAt c => Pretty (Mini (Text, LightJson c)) where
  pretty :: forall ann. Mini (Text, LightJson c) -> Doc ann
pretty (Mini (Text
fieldName, LightJson c
jpv)) = String -> Doc ann
forall a. String -> Doc a
text (Text -> String
forall a. Show a => a -> String
show Text
fieldName) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall a. String -> Doc a
text String
": " Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Mini (LightJson c) -> Doc ann
forall ann. Mini (LightJson c) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (LightJson c -> Mini (LightJson c)
forall a. a -> Mini a
Mini LightJson c
jpv)

instance LightJsonAt c => Pretty (MQuery (LightJson c)) where
  pretty :: forall ann. MQuery (LightJson c) -> Doc ann
pretty = Row (DList (LightJson c)) -> Doc ann
forall ann. Row (DList (LightJson c)) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Row (DList (LightJson c)) -> Doc ann)
-> (MQuery (LightJson c) -> Row (DList (LightJson c)))
-> MQuery (LightJson c)
-> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> DList (LightJson c) -> Row (DList (LightJson c))
forall a. Int -> a -> Row a
Row Int
120 (DList (LightJson c) -> Row (DList (LightJson c)))
-> (MQuery (LightJson c) -> DList (LightJson c))
-> MQuery (LightJson c)
-> Row (DList (LightJson c))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MQuery (LightJson c) -> DList (LightJson c)
forall a. MQuery a -> DList a
mQuery

instance LightJsonAt c => Pretty (MQuery (Entry String (LightJson c))) where
  pretty :: forall ann. MQuery (Entry String (LightJson c)) -> Doc ann
pretty (MQuery DList (Entry String (LightJson c))
das) = Row (DList (Entry String (LightJson c))) -> Doc ann
forall ann. Row (DList (Entry String (LightJson c))) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Int
-> DList (Entry String (LightJson c))
-> Row (DList (Entry String (LightJson c)))
forall a. Int -> a -> Row a
Row Int
120 DList (Entry String (LightJson c))
das)

instance (BP.BalancedParens w, Rank0 w, Rank1 w, Select1 v, TestBit w) => LightJsonAt (GenericCursor BS.ByteString v w) where
  lightJsonAt :: GenericCursor ByteString v w
-> LightJson (GenericCursor ByteString v w)
lightJsonAt GenericCursor ByteString v w
k = case ByteString -> Maybe (Elem ByteString, ByteString)
forall v. Uncons v => v -> Maybe (Elem v, v)
uncons ByteString
remainder of
    Just (!Elem ByteString
c, ByteString
_) | Word8 -> Bool
forall c. JsonCharLike c => c -> Bool
isLeadingDigit2 Word8
Elem ByteString
c -> ByteString -> LightJson (GenericCursor ByteString v w)
forall c. ByteString -> LightJson c
LightJsonNumber  (ByteString -> ByteString
slurpNumber ByteString
remainder)
    Just (!Elem ByteString
c, ByteString
_) | Word8 -> Bool
forall c. JsonCharLike c => c -> Bool
isQuotDbl Word8
Elem ByteString
c       -> (Text -> LightJson (GenericCursor ByteString v w))
-> (Text -> LightJson (GenericCursor ByteString v w))
-> Either Text Text
-> LightJson (GenericCursor ByteString v w)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Text -> LightJson (GenericCursor ByteString v w)
forall c. Text -> LightJson c
LightJsonError Text -> LightJson (GenericCursor ByteString v w)
forall c. Text -> LightJson c
LightJsonString (ByteString -> Either Text Text
slurpText ByteString
remainder)
    Just (!Elem ByteString
c, ByteString
_) | Word8 -> Bool
forall c. JsonCharLike c => c -> Bool
isChar_t Word8
Elem ByteString
c        -> Bool -> LightJson (GenericCursor ByteString v w)
forall c. Bool -> LightJson c
LightJsonBool    Bool
True
    Just (!Elem ByteString
c, ByteString
_) | Word8 -> Bool
forall c. JsonCharLike c => c -> Bool
isChar_f Word8
Elem ByteString
c        -> Bool -> LightJson (GenericCursor ByteString v w)
forall c. Bool -> LightJson c
LightJsonBool    Bool
False
    Just (!Elem ByteString
c, ByteString
_) | Word8 -> Bool
forall c. JsonCharLike c => c -> Bool
isChar_n Word8
Elem ByteString
c        -> LightJson (GenericCursor ByteString v w)
forall c. LightJson c
LightJsonNull
    Just (!Elem ByteString
c, ByteString
_) | Word8 -> Bool
forall c. JsonCharLike c => c -> Bool
isBraceLeft Word8
Elem ByteString
c     -> [(Text, GenericCursor ByteString v w)]
-> LightJson (GenericCursor ByteString v w)
forall c. [(Text, c)] -> LightJson c
LightJsonObject (Maybe (GenericCursor ByteString v w)
-> [(Text, GenericCursor ByteString v w)]
mapValuesFrom   (GenericCursor ByteString v w
-> Maybe (GenericCursor ByteString v w)
forall k. TreeCursor k => k -> Maybe k
firstChild GenericCursor ByteString v w
k))
    Just (!Elem ByteString
c, ByteString
_) | Word8 -> Bool
forall c. JsonCharLike c => c -> Bool
isBracketLeft Word8
Elem ByteString
c   -> [GenericCursor ByteString v w]
-> LightJson (GenericCursor ByteString v w)
forall c. [c] -> LightJson c
LightJsonArray  (Maybe (GenericCursor ByteString v w)
-> [GenericCursor ByteString v w]
arrayValuesFrom (GenericCursor ByteString v w
-> Maybe (GenericCursor ByteString v w)
forall k. TreeCursor k => k -> Maybe k
firstChild GenericCursor ByteString v w
k))
    Just (Elem ByteString, ByteString)
_                           -> Text -> LightJson (GenericCursor ByteString v w)
forall c. Text -> LightJson c
LightJsonError Text
"Invalid Json Type"
    Maybe (Elem ByteString, ByteString)
Nothing                          -> Text -> LightJson (GenericCursor ByteString v w)
forall c. Text -> LightJson c
LightJsonError Text
"End of data"
    where ik :: v
ik                = GenericCursor ByteString v w -> v
forall t v w. GenericCursor t v w -> v
interests GenericCursor ByteString v w
k
          bpk :: w
bpk               = GenericCursor ByteString v w -> w
forall t v w. GenericCursor t v w -> w
balancedParens GenericCursor ByteString v w
k
          p :: Position
p                 = Count -> Position
lastPositionOf (v -> Count -> Count
forall v. Select1 v => v -> Count -> Count
select1 v
ik (w -> Count -> Count
forall v. Rank1 v => v -> Count -> Count
rank1 w
bpk (GenericCursor ByteString v w -> Count
forall t v w. GenericCursor t v w -> Count
cursorRank GenericCursor ByteString v w
k)))
          remainder :: ByteString
remainder         = Count -> ByteString -> ByteString
forall v. Drop v => Count -> v -> v
drop (Position -> Count
forall a. ToCount a => a -> Count
toCount Position
p) (GenericCursor ByteString v w -> ByteString
forall t v w. GenericCursor t v w -> t
cursorText GenericCursor ByteString v w
k)
          arrayValuesFrom :: Maybe (GenericCursor ByteString v w)
-> [GenericCursor ByteString v w]
arrayValuesFrom   = (Maybe (GenericCursor ByteString v w)
 -> Maybe
      (GenericCursor ByteString v w,
       Maybe (GenericCursor ByteString v w)))
-> Maybe (GenericCursor ByteString v w)
-> [GenericCursor ByteString v w]
forall b a. (b -> Maybe (a, b)) -> b -> [a]
L.unfoldr ((GenericCursor ByteString v w
 -> (GenericCursor ByteString v w,
     Maybe (GenericCursor ByteString v w)))
-> Maybe (GenericCursor ByteString v w)
-> Maybe
     (GenericCursor ByteString v w,
      Maybe (GenericCursor ByteString v w))
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (GenericCursor ByteString v w -> GenericCursor ByteString v w
forall a. a -> a
id (GenericCursor ByteString v w -> GenericCursor ByteString v w)
-> (GenericCursor ByteString v w
    -> Maybe (GenericCursor ByteString v w))
-> GenericCursor ByteString v w
-> (GenericCursor ByteString v w,
    Maybe (GenericCursor ByteString v w))
forall b c c'. (b -> c) -> (b -> c') -> b -> (c, c')
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& GenericCursor ByteString v w
-> Maybe (GenericCursor ByteString v w)
forall k. TreeCursor k => k -> Maybe k
nextSibling))
          mapValuesFrom :: Maybe (GenericCursor ByteString v w)
-> [(Text, GenericCursor ByteString v w)]
mapValuesFrom Maybe (GenericCursor ByteString v w)
j   = [GenericCursor ByteString v w]
-> [(GenericCursor ByteString v w, GenericCursor ByteString v w)]
forall {b}. [b] -> [(b, b)]
pairwise (Maybe (GenericCursor ByteString v w)
-> [GenericCursor ByteString v w]
arrayValuesFrom Maybe (GenericCursor ByteString v w)
j) [(GenericCursor ByteString v w, GenericCursor ByteString v w)]
-> ((GenericCursor ByteString v w, GenericCursor ByteString v w)
    -> [(Text, GenericCursor ByteString v w)])
-> [(Text, GenericCursor ByteString v w)]
forall a b. [a] -> (a -> [b]) -> [b]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (GenericCursor ByteString v w, GenericCursor ByteString v w)
-> [(Text, GenericCursor ByteString v w)]
forall {a} {b}. LightJsonAt a => (a, b) -> [(Text, b)]
asField
          pairwise :: [b] -> [(b, b)]
pairwise (b
a:b
b:[b]
rs) = (b
a, b
b) (b, b) -> [(b, b)] -> [(b, b)]
forall a. a -> [a] -> [a]
: [b] -> [(b, b)]
pairwise [b]
rs
          pairwise [b]
_        = []
          asField :: (a, b) -> [(Text, b)]
asField (a
a, b
b)    = case a -> LightJson a
forall a. LightJsonAt a => a -> LightJson a
lightJsonAt a
a of
                                LightJsonString Text
s -> [(Text
s, b
b)]
                                LightJson a
_                 -> []

instance (BP.BalancedParens w, Rank0 w, Rank1 w, Select1 v, TestBit w) => LightJsonAt (JSC.JsonCursor BS.ByteString v w) where
  lightJsonAt :: JsonCursor ByteString v w -> LightJson (JsonCursor ByteString v w)
lightJsonAt JsonCursor ByteString v w
k = if Count
kra Count -> Count -> Count
forall a. Integral a => a -> a -> a
`mod` Count
2 Count -> Count -> Bool
forall a. Eq a => a -> a -> Bool
== Count
1
    then let i :: Int
i = Count -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Count
kpa Count -> Count -> Count
forall a. Num a => a -> a -> a
- Count
1) :: Int in
      if Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< ByteString -> Int
BS.length ByteString
kt
        then case ByteString -> Int -> Word8
BSU.unsafeIndex ByteString
kt Int
i of
          Word8
91  -> [JsonCursor ByteString v w]
-> LightJson (JsonCursor ByteString v w)
forall c. [c] -> LightJson c
LightJsonArray  []
          Word8
123 -> [(Text, JsonCursor ByteString v w)]
-> LightJson (JsonCursor ByteString v w)
forall c. [(Text, c)] -> LightJson c
LightJsonObject []
          Word8
_   -> Text -> LightJson (JsonCursor ByteString v w)
forall c. Text -> LightJson c
LightJsonError Text
"Invalid collection character"
        else Text -> LightJson (JsonCursor ByteString v w)
forall c. Text -> LightJson c
LightJsonError Text
"Index out of bounds"
    else Text -> LightJson (JsonCursor ByteString v w)
forall c. Text -> LightJson c
LightJsonError Text
"Unaligned cursor"
    where kpa :: Count
kpa   = v -> Count -> Count
forall v. Select1 v => v -> Count -> Count
select1 v
kib Count
kta Count -> Count -> Count
forall a. Num a => a -> a -> a
+ Count
km
          kib :: v
kib   = JsonCursor ByteString v w -> v
forall t v w. JsonCursor t v w -> v
JSC.interests JsonCursor ByteString v w
k
          kra :: Count
kra   = JsonCursor ByteString v w -> Count
forall t v w. JsonCursor t v w -> Count
JSC.cursorRank JsonCursor ByteString v w
k
          ksa :: Count
ksa   = Count
kra Count -> Count -> Count
forall a. Num a => a -> a -> a
+ Count
1
          kta :: Count
kta   = Count
ksa Count -> Count -> Count
forall a. Integral a => a -> a -> a
`div` Count
2
          km :: Count
km    = Count
ksa Count -> Count -> Count
forall a. Integral a => a -> a -> a
`mod` Count
2
          kt :: ByteString
kt    = JsonCursor ByteString v w -> ByteString
forall t v w. JsonCursor t v w -> t
JSC.cursorText JsonCursor ByteString v w
k