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