packages feed

hw-json 0.8.1.0 → 0.9.0.0

raw patch · 50 files changed

+812/−871 lines, 50 filesdep +generic-lensdep +lensdep +optparse-applicativedep ~containersdep ~criteriondep ~hw-rankselectnew-component:exe:hw-jsonnew-uploaderPVP ok

version bump matches the API change (PVP)

Dependencies added: generic-lens, lens, optparse-applicative, resourcet

Dependency ranges changed: containers, criterion, hw-rankselect

API changes (from Hackage documentation)

- HaskellWorks.Data.Json.CharLike: class JsonCharLike c
- HaskellWorks.Data.Json.CharLike: instance HaskellWorks.Data.Json.CharLike.JsonCharLike GHC.Word.Word8
- HaskellWorks.Data.Json.CharLike: isBraceLeft :: JsonCharLike c => c -> Bool
- HaskellWorks.Data.Json.CharLike: isBracketLeft :: JsonCharLike c => c -> Bool
- HaskellWorks.Data.Json.CharLike: isChar_f :: JsonCharLike c => c -> Bool
- HaskellWorks.Data.Json.CharLike: isChar_n :: JsonCharLike c => c -> Bool
- HaskellWorks.Data.Json.CharLike: isChar_t :: JsonCharLike c => c -> Bool
- HaskellWorks.Data.Json.CharLike: isLeadingDigit2 :: JsonCharLike c => c -> Bool
- HaskellWorks.Data.Json.CharLike: isQuotDbl :: JsonCharLike c => c -> Bool
- HaskellWorks.Data.Json.Cursor: instance (HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.FromBlankedJson (HaskellWorks.Data.Json.Succinct.Cursor.InterestBits.JsonInterestBits a), HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.FromBlankedJson (HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens.JsonBalancedParens b)) => HaskellWorks.Data.FromByteString.FromByteString (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString a b)
- HaskellWorks.Data.Json.Cursor: instance Data.String.IsString (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString (HaskellWorks.Data.Bits.BitShown.BitShown (Data.Vector.Storable.Vector GHC.Word.Word16)) (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word16)))
- HaskellWorks.Data.Json.Cursor: instance Data.String.IsString (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString (HaskellWorks.Data.Bits.BitShown.BitShown (Data.Vector.Storable.Vector GHC.Word.Word32)) (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word32)))
- HaskellWorks.Data.Json.Cursor: instance Data.String.IsString (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString (HaskellWorks.Data.Bits.BitShown.BitShown (Data.Vector.Storable.Vector GHC.Word.Word64)) (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word64)))
- HaskellWorks.Data.Json.Cursor: instance Data.String.IsString (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString (HaskellWorks.Data.Bits.BitShown.BitShown (Data.Vector.Storable.Vector GHC.Word.Word8)) (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word8)))
- HaskellWorks.Data.Json.Cursor: instance Data.String.IsString (HaskellWorks.Data.Json.Cursor.JsonCursor GHC.Base.String (HaskellWorks.Data.Bits.BitShown.BitShown [GHC.Types.Bool]) (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens [GHC.Types.Bool]))
- HaskellWorks.Data.Json.Cursor: instance HaskellWorks.Data.FromForeignRegion.FromForeignRegion (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString (HaskellWorks.Data.Bits.BitShown.BitShown (Data.Vector.Storable.Vector GHC.Word.Word16)) (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word16)))
- HaskellWorks.Data.Json.Cursor: instance HaskellWorks.Data.FromForeignRegion.FromForeignRegion (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString (HaskellWorks.Data.Bits.BitShown.BitShown (Data.Vector.Storable.Vector GHC.Word.Word32)) (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word32)))
- HaskellWorks.Data.Json.Cursor: instance HaskellWorks.Data.FromForeignRegion.FromForeignRegion (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString (HaskellWorks.Data.Bits.BitShown.BitShown (Data.Vector.Storable.Vector GHC.Word.Word64)) (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word64)))
- HaskellWorks.Data.Json.Cursor: instance HaskellWorks.Data.FromForeignRegion.FromForeignRegion (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString (HaskellWorks.Data.Bits.BitShown.BitShown (Data.Vector.Storable.Vector GHC.Word.Word8)) (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word8)))
- HaskellWorks.Data.Json.Internal.MakeIndex: blankedJsonToBalancedParens2 :: [ByteString] -> [ByteString]
- HaskellWorks.Data.Json.PartialValue: instance HaskellWorks.Data.Json.PartialValue.JsonPartialValueAt HaskellWorks.Data.Json.Succinct.PartialIndex.JsonPartialIndex
- HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens: JsonBalancedParens :: a -> JsonBalancedParens a
- HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens: getJsonBalancedParens :: JsonBalancedParens a -> a
- HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens: instance HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.FromBlankedJson (HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens.JsonBalancedParens (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word16)))
- HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens: instance HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.FromBlankedJson (HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens.JsonBalancedParens (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word32)))
- HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens: instance HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.FromBlankedJson (HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens.JsonBalancedParens (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word64)))
- HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens: instance HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.FromBlankedJson (HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens.JsonBalancedParens (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word8)))
- HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens: instance HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.FromBlankedJson (HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens.JsonBalancedParens (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens [GHC.Types.Bool]))
- HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens: newtype JsonBalancedParens a
- HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson: BlankedJson :: [ByteString] -> BlankedJson
- HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson: class FromBlankedJson a
- HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson: fromBlankedJson :: FromBlankedJson a => BlankedJson -> a
- HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson: getBlankedJson :: BlankedJson -> [ByteString]
- HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson: instance GHC.Classes.Eq HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.BlankedJson
- HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson: instance GHC.Show.Show HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.BlankedJson
- HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson: instance HaskellWorks.Data.FromByteString.FromByteString HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.BlankedJson
- HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson: newtype BlankedJson
- HaskellWorks.Data.Json.Succinct.Cursor.InterestBits: JsonInterestBits :: a -> JsonInterestBits a
- HaskellWorks.Data.Json.Succinct.Cursor.InterestBits: getJsonInterestBits :: JsonInterestBits a -> a
- HaskellWorks.Data.Json.Succinct.Cursor.InterestBits: instance HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.FromBlankedJson (HaskellWorks.Data.Json.Succinct.Cursor.InterestBits.JsonInterestBits (HaskellWorks.Data.Bits.BitShown.BitShown (Data.Vector.Storable.Vector GHC.Word.Word16)))
- HaskellWorks.Data.Json.Succinct.Cursor.InterestBits: instance HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.FromBlankedJson (HaskellWorks.Data.Json.Succinct.Cursor.InterestBits.JsonInterestBits (HaskellWorks.Data.Bits.BitShown.BitShown (Data.Vector.Storable.Vector GHC.Word.Word32)))
- HaskellWorks.Data.Json.Succinct.Cursor.InterestBits: instance HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.FromBlankedJson (HaskellWorks.Data.Json.Succinct.Cursor.InterestBits.JsonInterestBits (HaskellWorks.Data.Bits.BitShown.BitShown (Data.Vector.Storable.Vector GHC.Word.Word64)))
- HaskellWorks.Data.Json.Succinct.Cursor.InterestBits: instance HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.FromBlankedJson (HaskellWorks.Data.Json.Succinct.Cursor.InterestBits.JsonInterestBits (HaskellWorks.Data.Bits.BitShown.BitShown (Data.Vector.Storable.Vector GHC.Word.Word8)))
- HaskellWorks.Data.Json.Succinct.Cursor.InterestBits: instance HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.FromBlankedJson (HaskellWorks.Data.Json.Succinct.Cursor.InterestBits.JsonInterestBits (HaskellWorks.Data.Bits.BitShown.BitShown Data.ByteString.Internal.ByteString))
- HaskellWorks.Data.Json.Succinct.Cursor.InterestBits: instance HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.FromBlankedJson (HaskellWorks.Data.Json.Succinct.Cursor.InterestBits.JsonInterestBits (HaskellWorks.Data.Bits.BitShown.BitShown [GHC.Types.Bool]))
- HaskellWorks.Data.Json.Succinct.Cursor.InterestBits: instance HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson.FromBlankedJson (HaskellWorks.Data.Json.Succinct.Cursor.InterestBits.JsonInterestBits HaskellWorks.Data.RankSelect.Poppy512.Poppy512)
- HaskellWorks.Data.Json.Succinct.Cursor.InterestBits: newtype JsonInterestBits a
- HaskellWorks.Data.Json.Succinct.Cursor.Token: jsonTokenAt :: (Rank1 w, Select1 v, TestBit w) => JsonCursor ByteString v w -> Maybe (JsonToken String Double)
- HaskellWorks.Data.Json.Succinct.Index: JsonIndexArray :: [JsonIndex] -> JsonIndex
- HaskellWorks.Data.Json.Succinct.Index: JsonIndexBool :: Bool -> JsonIndex
- HaskellWorks.Data.Json.Succinct.Index: JsonIndexNull :: JsonIndex
- HaskellWorks.Data.Json.Succinct.Index: JsonIndexNumber :: ByteString -> JsonIndex
- HaskellWorks.Data.Json.Succinct.Index: JsonIndexObject :: [(ByteString, JsonIndex)] -> JsonIndex
- HaskellWorks.Data.Json.Succinct.Index: JsonIndexString :: ByteString -> JsonIndex
- HaskellWorks.Data.Json.Succinct.Index: class JsonIndexAt a
- HaskellWorks.Data.Json.Succinct.Index: data JsonIndex
- HaskellWorks.Data.Json.Succinct.Index: instance (HaskellWorks.Data.BalancedParens.BalancedParens.BalancedParens w, HaskellWorks.Data.RankSelect.Base.Rank0.Rank0 w, HaskellWorks.Data.RankSelect.Base.Rank1.Rank1 w, HaskellWorks.Data.RankSelect.Base.Select1.Select1 v, HaskellWorks.Data.Bits.BitWise.TestBit w) => HaskellWorks.Data.Json.Succinct.Index.JsonIndexAt (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString v w)
- HaskellWorks.Data.Json.Succinct.Index: instance GHC.Classes.Eq HaskellWorks.Data.Json.Succinct.Index.JsonIndex
- HaskellWorks.Data.Json.Succinct.Index: instance GHC.Show.Show HaskellWorks.Data.Json.Succinct.Index.JsonIndex
- HaskellWorks.Data.Json.Succinct.Index: jsonIndexAt :: JsonIndexAt a => a -> Either DecodeError JsonIndex
- HaskellWorks.Data.Json.Succinct.PartialIndex: JsonPartialIndexArray :: [JsonPartialIndex] -> JsonPartialIndex
- HaskellWorks.Data.Json.Succinct.PartialIndex: JsonPartialIndexBool :: Bool -> JsonPartialIndex
- HaskellWorks.Data.Json.Succinct.PartialIndex: JsonPartialIndexError :: String -> JsonPartialIndex
- HaskellWorks.Data.Json.Succinct.PartialIndex: JsonPartialIndexNull :: JsonPartialIndex
- HaskellWorks.Data.Json.Succinct.PartialIndex: JsonPartialIndexNumber :: ByteString -> JsonPartialIndex
- HaskellWorks.Data.Json.Succinct.PartialIndex: JsonPartialIndexObject :: [(ByteString, JsonPartialIndex)] -> JsonPartialIndex
- HaskellWorks.Data.Json.Succinct.PartialIndex: JsonPartialIndexString :: ByteString -> JsonPartialIndex
- HaskellWorks.Data.Json.Succinct.PartialIndex: class JsonPartialIndexAt a
- HaskellWorks.Data.Json.Succinct.PartialIndex: data JsonPartialIndex
- HaskellWorks.Data.Json.Succinct.PartialIndex: instance (HaskellWorks.Data.BalancedParens.BalancedParens.BalancedParens w, HaskellWorks.Data.RankSelect.Base.Rank0.Rank0 w, HaskellWorks.Data.RankSelect.Base.Rank1.Rank1 w, HaskellWorks.Data.RankSelect.Base.Select1.Select1 v, HaskellWorks.Data.Bits.BitWise.TestBit w) => HaskellWorks.Data.Json.Succinct.PartialIndex.JsonPartialIndexAt (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString v w)
- HaskellWorks.Data.Json.Succinct.PartialIndex: instance GHC.Classes.Eq HaskellWorks.Data.Json.Succinct.PartialIndex.JsonPartialIndex
- HaskellWorks.Data.Json.Succinct.PartialIndex: instance GHC.Show.Show HaskellWorks.Data.Json.Succinct.PartialIndex.JsonPartialIndex
- HaskellWorks.Data.Json.Succinct.PartialIndex: jsonPartialIndexAt :: JsonPartialIndexAt a => a -> JsonPartialIndex
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBoolean :: Bool -> JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBraceL :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBraceR :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBracketL :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBracketR :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenColon :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenComma :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenNull :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenNumber :: d -> JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenString :: s -> JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenWhitespace :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: class IsChar c
- HaskellWorks.Data.Json.Token.Tokenize: class ParseJson t s d
- HaskellWorks.Data.Json.Token.Tokenize: data JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: instance HaskellWorks.Data.Json.Token.Tokenize.ParseJson Data.ByteString.Internal.ByteString Data.ByteString.Internal.ByteString GHC.Types.Double
- HaskellWorks.Data.Json.Token.Tokenize: instance HaskellWorks.Data.Json.Token.Tokenize.ParseJson Data.ByteString.Internal.ByteString GHC.Base.String GHC.Types.Double
- HaskellWorks.Data.Json.Token.Tokenize: parseJsonToken :: ParseJson t s d => Parser t (JsonToken s d)
- HaskellWorks.Data.Json.Token.Tokenize: parseJsonTokenBoolean :: ParseJson t s d => Parser t (JsonToken s d)
- HaskellWorks.Data.Json.Token.Tokenize: parseJsonTokenBraceL :: ParseJson t s d => Parser t (JsonToken s d)
- HaskellWorks.Data.Json.Token.Tokenize: parseJsonTokenBraceR :: ParseJson t s d => Parser t (JsonToken s d)
- HaskellWorks.Data.Json.Token.Tokenize: parseJsonTokenBracketL :: ParseJson t s d => Parser t (JsonToken s d)
- HaskellWorks.Data.Json.Token.Tokenize: parseJsonTokenBracketR :: ParseJson t s d => Parser t (JsonToken s d)
- HaskellWorks.Data.Json.Token.Tokenize: parseJsonTokenColon :: ParseJson t s d => Parser t (JsonToken s d)
- HaskellWorks.Data.Json.Token.Tokenize: parseJsonTokenComma :: ParseJson t s d => Parser t (JsonToken s d)
- HaskellWorks.Data.Json.Token.Tokenize: parseJsonTokenDouble :: ParseJson t s d => Parser t (JsonToken s d)
- HaskellWorks.Data.Json.Token.Tokenize: parseJsonTokenNull :: ParseJson t s d => Parser t (JsonToken s d)
- HaskellWorks.Data.Json.Token.Tokenize: parseJsonTokenString :: ParseJson t s d => Parser t (JsonToken s d)
- HaskellWorks.Data.Json.Token.Tokenize: parseJsonTokenWhitespace :: ParseJson t s d => Parser t (JsonToken s d)
- HaskellWorks.Data.Json.Token.Tokenize: toChar :: IsChar c => c -> Char
- HaskellWorks.Data.Json.Token.Types: JsonTokenBoolean :: Bool -> JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenBraceL :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenBraceR :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenBracketL :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenBracketR :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenColon :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenComma :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenNull :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenNumber :: d -> JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenString :: s -> JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenWhitespace :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: data JsonToken s d
- HaskellWorks.Data.Json.Token.Types: instance (GHC.Classes.Eq s, GHC.Classes.Eq d) => GHC.Classes.Eq (HaskellWorks.Data.Json.Token.Types.JsonToken s d)
- HaskellWorks.Data.Json.Token.Types: instance (GHC.Show.Show s, GHC.Show.Show d) => GHC.Show.Show (HaskellWorks.Data.Json.Token.Types.JsonToken s d)
- HaskellWorks.Data.Json.Value: instance HaskellWorks.Data.Json.Value.JsonValueAt HaskellWorks.Data.Json.Succinct.Index.JsonIndex
- HaskellWorks.Data.Json.Value.Internal: parseHexDigit :: Parser t u => Parser t Int
- HaskellWorks.Data.Json.Value.Internal: parseHexDigitAlphaLower :: Parser t u => Parser t Int
- HaskellWorks.Data.Json.Value.Internal: parseHexDigitAlphaUpper :: Parser t u => Parser t Int
- HaskellWorks.Data.Json.Value.Internal: parseHexDigitNumeric :: Parser t u => Parser t Int
- HaskellWorks.Data.Json.Value.Internal: parseJsonString :: (Parser t u, IsString t) => Parser t String
+ HaskellWorks.Data.Json.Cursor: instance Data.String.IsString (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString (Data.Vector.Storable.Vector GHC.Word.Word64) (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word64)))
+ HaskellWorks.Data.Json.Cursor: instance HaskellWorks.Data.FromByteString.FromByteString (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString (Data.Vector.Storable.Vector GHC.Word.Word64) (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word64)))
+ HaskellWorks.Data.Json.Cursor: instance HaskellWorks.Data.FromByteString.FromByteString (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString HaskellWorks.Data.RankSelect.Poppy512.Poppy512 (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word64)))
+ HaskellWorks.Data.Json.Cursor: instance HaskellWorks.Data.FromForeignRegion.FromForeignRegion (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString (Data.Vector.Storable.Vector GHC.Word.Word64) (HaskellWorks.Data.BalancedParens.Simple.SimpleBalancedParens (Data.Vector.Storable.Vector GHC.Word.Word64)))
+ HaskellWorks.Data.Json.Internal.BlankedJson: BlankedJson :: [ByteString] -> BlankedJson
+ HaskellWorks.Data.Json.Internal.BlankedJson: [unBlankedJson] :: BlankedJson -> [ByteString]
+ HaskellWorks.Data.Json.Internal.BlankedJson: class ToBlankedJson a
+ HaskellWorks.Data.Json.Internal.BlankedJson: instance GHC.Classes.Eq HaskellWorks.Data.Json.Internal.BlankedJson.BlankedJson
+ HaskellWorks.Data.Json.Internal.BlankedJson: instance GHC.Show.Show HaskellWorks.Data.Json.Internal.BlankedJson.BlankedJson
+ HaskellWorks.Data.Json.Internal.BlankedJson: instance HaskellWorks.Data.Json.Internal.BlankedJson.ToBlankedJson Data.ByteString.Internal.ByteString
+ HaskellWorks.Data.Json.Internal.BlankedJson: newtype BlankedJson
+ HaskellWorks.Data.Json.Internal.BlankedJson: toBlankedJson :: ToBlankedJson a => a -> [ByteString]
+ HaskellWorks.Data.Json.Internal.BlankedJson: toBlankedJsonTyped :: ToBlankedJson a => a -> BlankedJson
+ HaskellWorks.Data.Json.Internal.CharLike: class JsonCharLike c
+ HaskellWorks.Data.Json.Internal.CharLike: instance HaskellWorks.Data.Json.Internal.CharLike.JsonCharLike GHC.Word.Word8
+ HaskellWorks.Data.Json.Internal.CharLike: isBraceLeft :: JsonCharLike c => c -> Bool
+ HaskellWorks.Data.Json.Internal.CharLike: isBracketLeft :: JsonCharLike c => c -> Bool
+ HaskellWorks.Data.Json.Internal.CharLike: isChar_f :: JsonCharLike c => c -> Bool
+ HaskellWorks.Data.Json.Internal.CharLike: isChar_n :: JsonCharLike c => c -> Bool
+ HaskellWorks.Data.Json.Internal.CharLike: isChar_t :: JsonCharLike c => c -> Bool
+ HaskellWorks.Data.Json.Internal.CharLike: isLeadingDigit2 :: JsonCharLike c => c -> Bool
+ HaskellWorks.Data.Json.Internal.CharLike: isQuotDbl :: JsonCharLike c => c -> Bool
+ HaskellWorks.Data.Json.Internal.Cursor.Token: jsonTokenAt :: (Rank1 w, Select1 v, TestBit w) => JsonCursor ByteString v w -> Maybe (JsonToken String Double)
+ HaskellWorks.Data.Json.Internal.IbBp: IbBp :: Vector Word64 -> Vector Word64 -> IbBp
+ HaskellWorks.Data.Json.Internal.IbBp: [bp] :: IbBp -> Vector Word64
+ HaskellWorks.Data.Json.Internal.IbBp: [ib] :: IbBp -> Vector Word64
+ HaskellWorks.Data.Json.Internal.IbBp: class ToIbBp a
+ HaskellWorks.Data.Json.Internal.IbBp: data IbBp
+ HaskellWorks.Data.Json.Internal.IbBp: instance HaskellWorks.Data.Json.Internal.IbBp.ToIbBp Data.ByteString.Internal.ByteString
+ HaskellWorks.Data.Json.Internal.IbBp: toIbBp :: ToIbBp a => a -> IbBp
+ HaskellWorks.Data.Json.Internal.Index: JsonIndexArray :: [JsonIndex] -> JsonIndex
+ HaskellWorks.Data.Json.Internal.Index: JsonIndexBool :: Bool -> JsonIndex
+ HaskellWorks.Data.Json.Internal.Index: JsonIndexNull :: JsonIndex
+ HaskellWorks.Data.Json.Internal.Index: JsonIndexNumber :: ByteString -> JsonIndex
+ HaskellWorks.Data.Json.Internal.Index: JsonIndexObject :: [(ByteString, JsonIndex)] -> JsonIndex
+ HaskellWorks.Data.Json.Internal.Index: JsonIndexString :: ByteString -> JsonIndex
+ HaskellWorks.Data.Json.Internal.Index: class JsonIndexAt a
+ HaskellWorks.Data.Json.Internal.Index: data JsonIndex
+ HaskellWorks.Data.Json.Internal.Index: instance (HaskellWorks.Data.BalancedParens.BalancedParens.BalancedParens w, HaskellWorks.Data.RankSelect.Base.Rank0.Rank0 w, HaskellWorks.Data.RankSelect.Base.Rank1.Rank1 w, HaskellWorks.Data.RankSelect.Base.Select1.Select1 v, HaskellWorks.Data.Bits.BitWise.TestBit w) => HaskellWorks.Data.Json.Internal.Index.JsonIndexAt (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString v w)
+ HaskellWorks.Data.Json.Internal.Index: instance GHC.Classes.Eq HaskellWorks.Data.Json.Internal.Index.JsonIndex
+ HaskellWorks.Data.Json.Internal.Index: instance GHC.Show.Show HaskellWorks.Data.Json.Internal.Index.JsonIndex
+ HaskellWorks.Data.Json.Internal.Index: jsonIndexAt :: JsonIndexAt a => a -> Either DecodeError JsonIndex
+ HaskellWorks.Data.Json.Internal.PartialIndex: JsonPartialIndexArray :: [JsonPartialIndex] -> JsonPartialIndex
+ HaskellWorks.Data.Json.Internal.PartialIndex: JsonPartialIndexBool :: Bool -> JsonPartialIndex
+ HaskellWorks.Data.Json.Internal.PartialIndex: JsonPartialIndexError :: String -> JsonPartialIndex
+ HaskellWorks.Data.Json.Internal.PartialIndex: JsonPartialIndexNull :: JsonPartialIndex
+ HaskellWorks.Data.Json.Internal.PartialIndex: JsonPartialIndexNumber :: ByteString -> JsonPartialIndex
+ HaskellWorks.Data.Json.Internal.PartialIndex: JsonPartialIndexObject :: [(ByteString, JsonPartialIndex)] -> JsonPartialIndex
+ HaskellWorks.Data.Json.Internal.PartialIndex: JsonPartialIndexString :: ByteString -> JsonPartialIndex
+ HaskellWorks.Data.Json.Internal.PartialIndex: class JsonPartialIndexAt a
+ HaskellWorks.Data.Json.Internal.PartialIndex: data JsonPartialIndex
+ HaskellWorks.Data.Json.Internal.PartialIndex: instance (HaskellWorks.Data.BalancedParens.BalancedParens.BalancedParens w, HaskellWorks.Data.RankSelect.Base.Rank0.Rank0 w, HaskellWorks.Data.RankSelect.Base.Rank1.Rank1 w, HaskellWorks.Data.RankSelect.Base.Select1.Select1 v, HaskellWorks.Data.Bits.BitWise.TestBit w) => HaskellWorks.Data.Json.Internal.PartialIndex.JsonPartialIndexAt (HaskellWorks.Data.Json.Cursor.JsonCursor Data.ByteString.Internal.ByteString v w)
+ HaskellWorks.Data.Json.Internal.PartialIndex: instance GHC.Classes.Eq HaskellWorks.Data.Json.Internal.PartialIndex.JsonPartialIndex
+ HaskellWorks.Data.Json.Internal.PartialIndex: instance GHC.Show.Show HaskellWorks.Data.Json.Internal.PartialIndex.JsonPartialIndex
+ HaskellWorks.Data.Json.Internal.PartialIndex: jsonPartialIndexAt :: JsonPartialIndexAt a => a -> JsonPartialIndex
+ HaskellWorks.Data.Json.Internal.ToBalancedParens64: class ToBalancedParens64 a
+ HaskellWorks.Data.Json.Internal.ToBalancedParens64: instance HaskellWorks.Data.Json.Internal.ToBalancedParens64.ToBalancedParens64 HaskellWorks.Data.Json.Internal.BlankedJson.BlankedJson
+ HaskellWorks.Data.Json.Internal.ToBalancedParens64: toBalancedParens64 :: ToBalancedParens64 a => a -> Vector Word64
+ HaskellWorks.Data.Json.Internal.ToInterestBits64: class ToInterestBits64 a
+ HaskellWorks.Data.Json.Internal.ToInterestBits64: instance HaskellWorks.Data.Json.Internal.ToInterestBits64.ToInterestBits64 HaskellWorks.Data.Json.Internal.BlankedJson.BlankedJson
+ HaskellWorks.Data.Json.Internal.ToInterestBits64: toInterestBits64 :: ToInterestBits64 a => a -> Vector Word64
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: JsonTokenBoolean :: Bool -> JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: JsonTokenBraceL :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: JsonTokenBraceR :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: JsonTokenBracketL :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: JsonTokenBracketR :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: JsonTokenColon :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: JsonTokenComma :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: JsonTokenNull :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: JsonTokenNumber :: d -> JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: JsonTokenString :: s -> JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: JsonTokenWhitespace :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: class IsChar c
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: class ParseJson t s d
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: data JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: instance HaskellWorks.Data.Json.Internal.Token.Tokenize.ParseJson Data.ByteString.Internal.ByteString Data.ByteString.Internal.ByteString GHC.Types.Double
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: instance HaskellWorks.Data.Json.Internal.Token.Tokenize.ParseJson Data.ByteString.Internal.ByteString GHC.Base.String GHC.Types.Double
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: parseJsonToken :: ParseJson t s d => Parser t (JsonToken s d)
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: parseJsonTokenBoolean :: ParseJson t s d => Parser t (JsonToken s d)
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: parseJsonTokenBraceL :: ParseJson t s d => Parser t (JsonToken s d)
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: parseJsonTokenBraceR :: ParseJson t s d => Parser t (JsonToken s d)
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: parseJsonTokenBracketL :: ParseJson t s d => Parser t (JsonToken s d)
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: parseJsonTokenBracketR :: ParseJson t s d => Parser t (JsonToken s d)
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: parseJsonTokenColon :: ParseJson t s d => Parser t (JsonToken s d)
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: parseJsonTokenComma :: ParseJson t s d => Parser t (JsonToken s d)
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: parseJsonTokenDouble :: ParseJson t s d => Parser t (JsonToken s d)
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: parseJsonTokenNull :: ParseJson t s d => Parser t (JsonToken s d)
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: parseJsonTokenString :: ParseJson t s d => Parser t (JsonToken s d)
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: parseJsonTokenWhitespace :: ParseJson t s d => Parser t (JsonToken s d)
+ HaskellWorks.Data.Json.Internal.Token.Tokenize: toChar :: IsChar c => c -> Char
+ HaskellWorks.Data.Json.Internal.Token.Types: JsonTokenBoolean :: Bool -> JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Types: JsonTokenBraceL :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Types: JsonTokenBraceR :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Types: JsonTokenBracketL :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Types: JsonTokenBracketR :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Types: JsonTokenColon :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Types: JsonTokenComma :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Types: JsonTokenNull :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Types: JsonTokenNumber :: d -> JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Types: JsonTokenString :: s -> JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Types: JsonTokenWhitespace :: JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Types: data JsonToken s d
+ HaskellWorks.Data.Json.Internal.Token.Types: instance (GHC.Classes.Eq s, GHC.Classes.Eq d) => GHC.Classes.Eq (HaskellWorks.Data.Json.Internal.Token.Types.JsonToken s d)
+ HaskellWorks.Data.Json.Internal.Token.Types: instance (GHC.Show.Show s, GHC.Show.Show d) => GHC.Show.Show (HaskellWorks.Data.Json.Internal.Token.Types.JsonToken s d)
+ HaskellWorks.Data.Json.Internal.Value: parseHexDigit :: Parser t u => Parser t Int
+ HaskellWorks.Data.Json.Internal.Value: parseHexDigitAlphaLower :: Parser t u => Parser t Int
+ HaskellWorks.Data.Json.Internal.Value: parseHexDigitAlphaUpper :: Parser t u => Parser t Int
+ HaskellWorks.Data.Json.Internal.Value: parseHexDigitNumeric :: Parser t u => Parser t Int
+ HaskellWorks.Data.Json.Internal.Value: parseJsonString :: (Parser t u, IsString t) => Parser t String
+ HaskellWorks.Data.Json.Internal.Words: wIsJsonNumberDigit :: Word8 -> Bool
+ HaskellWorks.Data.Json.PartialValue: instance HaskellWorks.Data.Json.PartialValue.JsonPartialValueAt HaskellWorks.Data.Json.Internal.PartialIndex.JsonPartialIndex
+ HaskellWorks.Data.Json.Value: instance HaskellWorks.Data.Json.Value.JsonValueAt HaskellWorks.Data.Json.Internal.Index.JsonIndex
- HaskellWorks.Data.Json.Internal.MakeIndex: blankedJsonToBalancedParens :: [ByteString] -> [Bool]
+ HaskellWorks.Data.Json.Internal.MakeIndex: blankedJsonToBalancedParens :: [ByteString] -> [ByteString]
- HaskellWorks.Data.Json.LoadCursor: loadJsonWithIndex :: String -> IO (JsonCursor ByteString (BitShown (Vector Word64)) (SimpleBalancedParens (Vector Word64)))
+ HaskellWorks.Data.Json.LoadCursor: loadJsonWithIndex :: String -> IO (JsonCursor ByteString (Vector Word64) (SimpleBalancedParens (Vector Word64)))

Files

README.md view
@@ -55,7 +55,7 @@           82 import           HaskellWorks.Diagnostics           83 import           System.IO.MMap           88 (fptr :: ForeignPtr Word8, offset, size) <- mmapFileForeignPtr "../data/78mbs.json" ReadOnly Nothing-         276 cursor <- measure (fromForeignRegion (fptr, offset, size) :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64)))+         276 cursor <- measure (fromForeignRegion (fptr, offset, size) :: JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64)))  ## Examples @@ -70,7 +70,7 @@     import Data.Word     import System.CPUTime     (fptr :: ForeignPtr Word8, offset, size) <- mmapFileForeignPtr "/Users/jky/Downloads/78mbs.json" ReadOnly Nothing-    cursor <- measure (fromForeignRegion (fptr, offset, size) :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64)))+    cursor <- measure (fromForeignRegion (fptr, offset, size) :: JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64)))     let !bs = BSI.fromForeignPtr (castForeignPtr fptr) offset size     x <- measure $ jsonBsToInterestBs bs     let !y = BS.concat (unescape' "" [bs])@@ -111,9 +111,8 @@ let fc = TC.firstChild let ns = TC.nextSibling let pn = TC.parent-let cd = TC.depth let ss = TC.subtreeSize-let cursor = "[null, {\"field\": 1}]" :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64))+let cursor = "[null, {\"field\": 1}]" :: JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64)) cursor fc cursor (fc >=> ns) cursor
+ app/App/Commands.hs view
@@ -0,0 +1,13 @@+module App.Commands where++import App.Commands.CreateIndex+import Data.Semigroup           ((<>))+import Options.Applicative++commands :: Parser (IO ())+commands = commandsGeneral++commandsGeneral :: Parser (IO ())+commandsGeneral = subparser $ mempty+  <>  commandGroup "Commands:"+  <>  cmdCreateIndex
+ app/App/Commands/CreateIndex.hs view
@@ -0,0 +1,51 @@+{-# LANGUAGE BangPatterns        #-}+{-# LANGUAGE ScopedTypeVariables #-}++module App.Commands.CreateIndex+  ( cmdCreateIndex+  ) where++import App.Commands.Types+import Control.Lens+import Data.Semigroup      ((<>))+import Data.Word+import Foreign+import Options.Applicative hiding (columns)++import qualified App.Lens                                           as L+import qualified Data.ByteString.Builder                            as B+import qualified Data.ByteString.Internal                           as BSI+import qualified Data.ByteString.Lazy                               as LBS+import qualified Data.Vector.Storable                               as DVS+import qualified HaskellWorks.Data.Json.Internal.Blank              as J+import qualified HaskellWorks.Data.Json.Internal.BlankedJson        as J+import qualified HaskellWorks.Data.Json.Internal.MakeIndex          as J+import qualified HaskellWorks.Data.Json.Internal.ToBalancedParens64 as J+import qualified System.IO                                          as IO+import qualified System.IO.MMap                                     as IO++runCreateIndex :: CreateIndexOptions -> IO ()+runCreateIndex opts = do+  let filePath = opts ^. L.filePath+  (fptr :: ForeignPtr Word8, offset, size) <- IO.mmapFileForeignPtr filePath IO.ReadOnly Nothing+  let !bs = BSI.fromForeignPtr (castForeignPtr fptr) offset size+  let blankedJson = J.blankJson [bs]+  let ibs = LBS.fromChunks (J.blankedJsonToInterestBits blankedJson)+  let bps = J.toBalancedParens64 (J.BlankedJson blankedJson)+  let vb = DVS.foldl (\b a -> b <> B.word64LE a) mempty bps+  LBS.writeFile (filePath <> ".ib.idx") ibs+  h <- IO.openFile (filePath <> ".bp.idx") IO.WriteMode+  B.hPutBuilder h vb+  IO.hClose h++optsCreateIndex :: Parser CreateIndexOptions+optsCreateIndex = CreateIndexOptions+  <$> strOption+        (   long "input"+        <>  short 'i'+        <>  help "Input JSON file"+        <>  metavar "STRING"+        )++cmdCreateIndex :: Mod CommandFields (IO ())+cmdCreateIndex = command "create-index"  $ flip info idm $ runCreateIndex <$> optsCreateIndex
+ app/App/Commands/Demo.hs view
@@ -0,0 +1,40 @@+{-# LANGUAGE BangPatterns        #-}+{-# LANGUAGE OverloadedStrings   #-}+{-# LANGUAGE ScopedTypeVariables #-}++module App.Commands.Demo+  ( cmdDemo+  ) where++import App.Commands.Types+import Control.Lens+import Control.Monad+import Data.Semigroup                    ((<>))+import HaskellWorks.Data.Json.LightJson+import HaskellWorks.Data.Json.LoadCursor+import HaskellWorks.Data.Micro+import HaskellWorks.Data.MQuery+import Options.Applicative               hiding (columns)++import qualified App.Lens   as L+import qualified Data.DList as DL++runDemo :: DemoOptions -> IO ()+runDemo opts = do+  !cursor <- loadJsonWithCsPoppyIndex (opts ^. L.filePath)+  let !json = lightJsonAt cursor+  let q = MQuery (DL.singleton json)++  putPretty $ q >>= (item >=> entry >=> named "acquisition" >=> entry >=> named "price_currency_code" >=> asString) & count++optsDemo :: Parser DemoOptions+optsDemo = DemoOptions+  <$> strOption+        (   long "input"+        <>  short 'i'+        <>  help "Input DSV file"+        <>  metavar "STRING"+        )++cmdDemo :: Mod CommandFields (IO ())+cmdDemo = command "create-index"  $ flip info idm $ runDemo <$> optsDemo
+ app/App/Commands/Types.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE DuplicateRecordFields #-}++module App.Commands.Types+  ( CreateIndexOptions(..)+  , DemoOptions(..)+  ) where++newtype CreateIndexOptions = CreateIndexOptions+  { _createIndexOptionsFilePath  :: FilePath+  } deriving (Eq, Show)++newtype DemoOptions = DemoOptions+  { _demoOptionsFilePath  :: FilePath+  } deriving (Eq, Show)
+ app/App/IO.hs view
@@ -0,0 +1,27 @@+module App.IO where++import Control.Monad+import Control.Monad.IO.Class+import Control.Monad.Trans.Resource+import System.IO                    (Handle)++import qualified Data.ByteString.Lazy as LBS+import qualified System.IO            as IO++openOutputFile :: MonadResource m => FilePath -> Maybe Int -> m (ReleaseKey, Handle)+openOutputFile "-" _ = allocate (return IO.stdout) (const (return ()))+openOutputFile filePath maybeBufferSize = allocate open close+  where open  = do+          handle <- IO.openFile filePath IO.WriteMode+          forM_ maybeBufferSize $ \bufferSize ->+            liftIO $ IO.hSetBuffering handle (IO.BlockBuffering (Just bufferSize))+          return handle+        close = IO.hClose++readInputFile :: FilePath -> IO LBS.ByteString+readInputFile "-"      = LBS.hGetContents IO.stdin+readInputFile filePath = LBS.readFile filePath++writeOutputFile :: FilePath -> LBS.ByteString -> IO ()+writeOutputFile "-"      bs = LBS.hPut IO.stdout bs+writeOutputFile filePath bs = LBS.writeFile filePath bs
+ app/App/Lens.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE FlexibleInstances      #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE MultiParamTypeClasses  #-}+{-# LANGUAGE TemplateHaskell        #-}+{-# LANGUAGE TypeFamilies           #-}+{-# LANGUAGE TypeSynonymInstances   #-}++module App.Lens where++import App.Commands.Types+import Control.Lens++makeFields ''CreateIndexOptions+makeFields ''DemoOptions
app/Main.hs view
@@ -1,53 +1,11 @@-{-# LANGUAGE BangPatterns        #-}-{-# LANGUAGE OverloadedStrings   #-}-{-# LANGUAGE ScopedTypeVariables #-}- module Main where +import App.Commands import Control.Monad-import Data.Function-import Data.Word-import HaskellWorks.Data.BalancedParens.Simple-import HaskellWorks.Data.Bits.BitShown-import HaskellWorks.Data.FromByteString-import HaskellWorks.Data.Json.Cursor-import HaskellWorks.Data.Json.LightJson-import HaskellWorks.Data.Json.LoadCursor-import HaskellWorks.Data.Micro-import HaskellWorks.Data.MQuery--import qualified Data.ByteString      as BS-import qualified Data.DList           as DL-import qualified Data.Vector.Storable as DVS--readJson :: String -> IO (JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64)))-readJson path = do-  bs <- BS.readFile path-  print ("Read file" :: String)-  let !cursor = fromByteString bs :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64))-  print ("Created cursor" :: String)-  return cursor---- exploreSiblings :: BalancedParens b => b -> Count -> ([Count] -> [Count])--- exploreSiblings b c = case nextSibling b c of---   Just d -> (d:) . explore b d---   Nothing -> id------ exploreChildren :: BalancedParens b => b -> Count -> ([Count] -> [Count])--- exploreChildren b c = case firstChild b c of---   Just d -> (d:) . explore b d---   Nothing -> id------ explore :: BalancedParens b => b -> Count -> ([Count] -> [Count])--- explore b c = exploreSiblings b c . exploreChildren b c+import Data.Semigroup      ((<>))+import Options.Applicative  main :: IO ()-main = do-  !cursor <- loadJsonWithCsPoppyIndex "../data/78mb.json"-  -- let ranks = explore (balancedParens cursor) (cursorRank cursor)-  -- putStrLn $ "Ranks: " ++ show (length (ranks []))--  let !json = lightJsonAt cursor-  let q = MQuery (DL.singleton json)--  putPretty $ q >>= (item >=> entry >=> named "acquisition" >=> entry >=> named "price_currency_code" >=> asString) & count+main = join $ customExecParser+  (prefs $ showHelpOnEmpty <> showHelpOnError)+  (info (commands <**> helper) idm)
bench/Main.hs view
@@ -9,7 +9,6 @@ import Data.Word import Foreign import HaskellWorks.Data.BalancedParens.Simple-import HaskellWorks.Data.Bits.BitShown import HaskellWorks.Data.FromByteString import HaskellWorks.Data.Json.Cursor import HaskellWorks.Data.Json.Internal.Blank@@ -27,8 +26,8 @@   let !bs = BSI.fromForeignPtr (castForeignPtr fptr) offset size   return bs -loadJson :: BS.ByteString -> JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64))-loadJson bs = fromByteString bs :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64))+loadJson :: BS.ByteString -> JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64))+loadJson bs = fromByteString bs :: JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64))  jsonToInterestBits3 :: [BS.ByteString] -> [BS.ByteString] jsonToInterestBits3 = blankedJsonToInterestBits . blankJson
hw-json.cabal view
@@ -3,7 +3,7 @@ -- see: https://github.com/sol/hpack  name:           hw-json-version:        0.8.1.0+version:        0.9.0.0 synopsis:       Memory efficient JSON parser description:    Memory efficient JSON parser. Please see README.md category:       Data@@ -51,14 +51,14 @@     , hw-balancedparens   >= 0.2.0.1    && < 0.3     , hw-bits             >= 0.7.0.2    && < 0.8     , hw-prim             >= 0.6.2.0    && < 0.7-    , hw-rankselect       >= 0.10       && < 0.11+    , hw-rankselect       >= 0.10       && < 0.13     , hw-rankselect-base  >= 0.3        && < 0.4     , mmap                >= 0.5        && < 0.6     , vector              >= 0.12       && < 0.13     , array             >= 0.5        && < 0.6     , ansi-wl-pprint    >= 0.6.8.2    && < 0.7     , attoparsec        >= 0.13       && < 0.14-    , containers        >= 0.5        && < 0.6+    , containers        >= 0.5        && < 0.7     , dlist             >= 0.8        && < 0.9     , hw-mquery         >= 0.1        && < 0.2     , hw-parser         >= 0.1        && < 0.2@@ -71,34 +71,35 @@     cpp-options: -DBMI2_ENABLED   exposed-modules:       HaskellWorks.Data.Json-      HaskellWorks.Data.Json.CharLike       HaskellWorks.Data.Json.Cursor       HaskellWorks.Data.Json.DecodeError       HaskellWorks.Data.Json.FromValue       HaskellWorks.Data.Json.Internal.Blank+      HaskellWorks.Data.Json.Internal.BlankedJson+      HaskellWorks.Data.Json.Internal.CharLike+      HaskellWorks.Data.Json.Internal.Cursor.Token+      HaskellWorks.Data.Json.Internal.IbBp+      HaskellWorks.Data.Json.Internal.Index       HaskellWorks.Data.Json.Internal.MakeIndex+      HaskellWorks.Data.Json.Internal.PartialIndex+      HaskellWorks.Data.Json.Internal.ToBalancedParens64+      HaskellWorks.Data.Json.Internal.ToInterestBits64+      HaskellWorks.Data.Json.Internal.Token+      HaskellWorks.Data.Json.Internal.Token.Tokenize+      HaskellWorks.Data.Json.Internal.Token.Types+      HaskellWorks.Data.Json.Internal.Value       HaskellWorks.Data.Json.Internal.Words       HaskellWorks.Data.Json.LightJson       HaskellWorks.Data.Json.Load       HaskellWorks.Data.Json.LoadCursor       HaskellWorks.Data.Json.PartialValue-      HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens-      HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson-      HaskellWorks.Data.Json.Succinct.Cursor.InterestBits-      HaskellWorks.Data.Json.Succinct.Cursor.Token-      HaskellWorks.Data.Json.Succinct.Index-      HaskellWorks.Data.Json.Succinct.PartialIndex-      HaskellWorks.Data.Json.Token-      HaskellWorks.Data.Json.Token.Tokenize-      HaskellWorks.Data.Json.Token.Types       HaskellWorks.Data.Json.Type       HaskellWorks.Data.Json.Value-      HaskellWorks.Data.Json.Value.Internal   other-modules:       Paths_hw_json   default-language: Haskell2010 -executable hw-json-example+executable hw-json   main-is: Main.hs   hs-source-dirs:       app@@ -109,19 +110,30 @@     , hw-balancedparens   >= 0.2.0.1    && < 0.3     , hw-bits             >= 0.7.0.2    && < 0.8     , hw-prim             >= 0.6.2.0    && < 0.7-    , hw-rankselect       >= 0.10       && < 0.11+    , hw-rankselect       >= 0.10       && < 0.13     , hw-rankselect-base  >= 0.3        && < 0.4     , mmap                >= 0.5        && < 0.6     , vector              >= 0.12       && < 0.13-    , criterion         >= 1.4        && < 1.5-    , dlist             >= 0.8        && < 0.9+    , criterion             >= 1.4        && < 1.6+    , dlist                 >= 0.8        && < 0.9     , hw-json-    , hw-mquery         >= 0.1        && < 0.2+    , hw-mquery             >= 0.1        && < 0.2+    , generic-lens          >= 1          && < 1.1+    , lens                  >= 4          && < 5+    , optparse-applicative  >= 0.14       && < 0.15+    , resourcet             >= 1.2        && < 1.3   if (flag(sse42))     ghc-options: -mbmi2   if (flag(bmi2)) && (impl(ghc >=8.4.1))     ghc-options: -mbmi2 -msse4.2     cpp-options: -DBMI2_ENABLED+  other-modules:+      App.Commands+      App.Commands.CreateIndex+      App.Commands.Demo+      App.Commands.Types+      App.IO+      App.Lens   default-language: Haskell2010  test-suite hw-json-test@@ -136,12 +148,12 @@     , hw-balancedparens   >= 0.2.0.1    && < 0.3     , hw-bits             >= 0.7.0.2    && < 0.8     , hw-prim             >= 0.6.2.0    && < 0.7-    , hw-rankselect       >= 0.10       && < 0.11+    , hw-rankselect       >= 0.10       && < 0.13     , hw-rankselect-base  >= 0.3        && < 0.4     , mmap                >= 0.5        && < 0.6     , vector              >= 0.12       && < 0.13     , attoparsec        >= 0.13       && < 0.14-    , containers        >= 0.5        && < 0.6+    , containers        >= 0.5        && < 0.7     , hspec             >= 2.5        && < 2.6     , hw-json   if (flag(sse42))@@ -172,11 +184,11 @@     , hw-balancedparens   >= 0.2.0.1    && < 0.3     , hw-bits             >= 0.7.0.2    && < 0.8     , hw-prim             >= 0.6.2.0    && < 0.7-    , hw-rankselect       >= 0.10       && < 0.11+    , hw-rankselect       >= 0.10       && < 0.13     , hw-rankselect-base  >= 0.3        && < 0.4     , mmap                >= 0.5        && < 0.6     , vector              >= 0.12       && < 0.13-    , criterion         >= 1.4        && < 1.5+    , criterion         >= 1.4        && < 1.6     , directory         >= 1.3        && < 1.4     , hw-json   if (flag(sse42))
src/HaskellWorks/Data/Json.hs view
@@ -7,6 +7,5 @@     ( module X     ) where -import HaskellWorks.Data.Json.Token as X import HaskellWorks.Data.Json.Type  as X import HaskellWorks.Data.Json.Value as X
− src/HaskellWorks/Data/Json/CharLike.hs
@@ -1,23 +0,0 @@-module HaskellWorks.Data.Json.CharLike where--import Data.Word-import Data.Word8-import HaskellWorks.Data.Json.Internal.Words--class JsonCharLike c where-  isLeadingDigit2 :: c -> Bool-  isQuotDbl :: c -> Bool-  isChar_t :: c -> Bool-  isChar_f :: c -> Bool-  isChar_n :: c -> Bool-  isBraceLeft :: c -> Bool-  isBracketLeft :: c -> Bool--instance JsonCharLike Word8 where-  isLeadingDigit2 = isLeadingDigit-  isQuotDbl       = (== _quotedbl)-  isChar_t        = (== _t)-  isChar_f        = (== _f)-  isChar_n        = (== _n)-  isBraceLeft     = (== _braceleft)-  isBracketLeft   = (== _bracketleft)
src/HaskellWorks/Data/Json/Cursor.hs view
@@ -9,15 +9,12 @@   , jsonCursorPos   ) where -import Data.ByteString.Internal                            as BSI+import Data.ByteString.Internal                  as BSI import Data.String import Data.Word import Foreign.ForeignPtr-import HaskellWorks.Data.Bits.BitShown import HaskellWorks.Data.FromByteString import HaskellWorks.Data.FromForeignRegion-import HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson-import HaskellWorks.Data.Json.Succinct.Cursor.InterestBits import HaskellWorks.Data.Positioning import HaskellWorks.Data.RankSelect.Base.Rank0 import HaskellWorks.Data.RankSelect.Base.Rank1@@ -25,11 +22,11 @@ import HaskellWorks.Data.RankSelect.Poppy512 import HaskellWorks.Data.TreeCursor -import qualified Data.ByteString                                       as BS-import qualified Data.ByteString.Char8                                 as BSC-import qualified Data.Vector.Storable                                  as DVS-import qualified HaskellWorks.Data.BalancedParens                      as BP-import qualified HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens as CBP+import qualified Data.ByteString                      as BS+import qualified Data.ByteString.Char8                as BSC+import qualified Data.Vector.Storable                 as DVS+import qualified HaskellWorks.Data.BalancedParens     as BP+import qualified HaskellWorks.Data.Json.Internal.IbBp as J  data JsonCursor t v w = JsonCursor   { cursorText     :: !t@@ -39,53 +36,31 @@   }   deriving (Eq, Show) -instance  (FromBlankedJson (JsonInterestBits a), FromBlankedJson (CBP.JsonBalancedParens b))-          => FromByteString (JsonCursor BS.ByteString a b) where-  fromByteString bs   = JsonCursor+instance FromByteString (JsonCursor BS.ByteString (DVS.Vector Word64) (BP.SimpleBalancedParens (DVS.Vector Word64))) where+  fromByteString bs = JsonCursor     { cursorText      = bs-    , interests       = getJsonInterestBits (fromBlankedJson blankedJson)-    , balancedParens  = CBP.getJsonBalancedParens (fromBlankedJson blankedJson)+    , interests       = ib+    , balancedParens  = BP.SimpleBalancedParens bp     , cursorRank      = 1     }-    where blankedJson :: BlankedJson-          blankedJson = fromByteString bs+    where J.IbBp ib bp = J.toIbBp bs -instance IsString (JsonCursor String (BitShown [Bool]) (BP.SimpleBalancedParens [Bool])) where-  fromString :: String -> JsonCursor String (BitShown [Bool]) (BP.SimpleBalancedParens [Bool])-  fromString s = JsonCursor-    { cursorText      = s+instance FromByteString (JsonCursor BS.ByteString Poppy512 (BP.SimpleBalancedParens (DVS.Vector Word64))) where+  fromByteString bs = JsonCursor+    { cursorText      = bs+    , interests       = makePoppy512 ib+    , balancedParens  = BP.SimpleBalancedParens bp     , cursorRank      = 1-    , interests       = getJsonInterestBits (fromBlankedJson blankedJson)-    , balancedParens  = CBP.getJsonBalancedParens (fromBlankedJson blankedJson)     }-    where blankedJson :: BlankedJson-          blankedJson = fromByteString (BSC.pack s)--instance IsString (JsonCursor BS.ByteString (BitShown (DVS.Vector Word8)) (BP.SimpleBalancedParens (DVS.Vector Word8))) where-  fromString = fromByteString . BSC.pack--instance IsString (JsonCursor BS.ByteString (BitShown (DVS.Vector Word16)) (BP.SimpleBalancedParens (DVS.Vector Word16))) where-  fromString = fromByteString . BSC.pack--instance IsString (JsonCursor BS.ByteString (BitShown (DVS.Vector Word32)) (BP.SimpleBalancedParens (DVS.Vector Word32))) where-  fromString = fromByteString . BSC.pack+    where J.IbBp ib bp = J.toIbBp bs -instance IsString (JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (BP.SimpleBalancedParens (DVS.Vector Word64))) where+instance IsString (JsonCursor BS.ByteString (DVS.Vector Word64) (BP.SimpleBalancedParens (DVS.Vector Word64))) where   fromString = fromByteString . BSC.pack  instance IsString (JsonCursor BS.ByteString Poppy512 (BP.SimpleBalancedParens (DVS.Vector Word64))) where   fromString = fromByteString . BSC.pack -instance FromForeignRegion (JsonCursor BS.ByteString (BitShown (DVS.Vector Word8)) (BP.SimpleBalancedParens (DVS.Vector Word8))) where-  fromForeignRegion (fptr, offset, size) = fromByteString (BSI.fromForeignPtr (castForeignPtr fptr) offset size)--instance FromForeignRegion (JsonCursor BS.ByteString (BitShown (DVS.Vector Word16)) (BP.SimpleBalancedParens (DVS.Vector Word16))) where-  fromForeignRegion (fptr, offset, size) = fromByteString (BSI.fromForeignPtr (castForeignPtr fptr) offset size)--instance FromForeignRegion (JsonCursor BS.ByteString (BitShown (DVS.Vector Word32)) (BP.SimpleBalancedParens (DVS.Vector Word32))) where-  fromForeignRegion (fptr, offset, size) = fromByteString (BSI.fromForeignPtr (castForeignPtr fptr) offset size)--instance FromForeignRegion (JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (BP.SimpleBalancedParens (DVS.Vector Word64))) where+instance FromForeignRegion (JsonCursor BS.ByteString (DVS.Vector Word64) (BP.SimpleBalancedParens (DVS.Vector Word64))) where   fromForeignRegion (fptr, offset, size) = fromByteString (BSI.fromForeignPtr (castForeignPtr fptr) offset size)  instance FromForeignRegion (JsonCursor BS.ByteString Poppy512 (BP.SimpleBalancedParens (DVS.Vector Word64))) where
+ src/HaskellWorks/Data/Json/Internal/BlankedJson.hs view
@@ -0,0 +1,24 @@++module HaskellWorks.Data.Json.Internal.BlankedJson+  ( BlankedJson(..)+  , ToBlankedJson(..)+  , toBlankedJsonTyped+  ) where++import HaskellWorks.Data.ByteString+import HaskellWorks.Data.Json.Internal.Blank++import qualified Data.ByteString as BS++newtype BlankedJson = BlankedJson+  { unBlankedJson :: [BS.ByteString]+  } deriving (Eq, Show)++class ToBlankedJson a where+  toBlankedJson :: a -> [BS.ByteString]++instance ToBlankedJson BS.ByteString where+  toBlankedJson bs = blankJson (chunkedBy 4096 bs)++toBlankedJsonTyped :: ToBlankedJson a => a -> BlankedJson+toBlankedJsonTyped = BlankedJson . toBlankedJson
+ src/HaskellWorks/Data/Json/Internal/CharLike.hs view
@@ -0,0 +1,23 @@+module HaskellWorks.Data.Json.Internal.CharLike where++import Data.Word+import Data.Word8+import HaskellWorks.Data.Json.Internal.Words++class JsonCharLike c where+  isLeadingDigit2 :: c -> Bool+  isQuotDbl :: c -> Bool+  isChar_t :: c -> Bool+  isChar_f :: c -> Bool+  isChar_n :: c -> Bool+  isBraceLeft :: c -> Bool+  isBracketLeft :: c -> Bool++instance JsonCharLike Word8 where+  isLeadingDigit2 = isLeadingDigit+  isQuotDbl       = (== _quotedbl)+  isChar_t        = (== _t)+  isChar_f        = (== _f)+  isChar_n        = (== _n)+  isBraceLeft     = (== _braceleft)+  isBracketLeft   = (== _bracketleft)
+ src/HaskellWorks/Data/Json/Internal/Cursor/Token.hs view
@@ -0,0 +1,24 @@++module HaskellWorks.Data.Json.Internal.Cursor.Token+  ( jsonTokenAt+  ) where++import Data.ByteString.Internal                       as BSI+import HaskellWorks.Data.Bits.BitWise+import HaskellWorks.Data.Drop+import HaskellWorks.Data.Json.Cursor+import HaskellWorks.Data.Json.Internal.Token.Tokenize+import HaskellWorks.Data.Positioning+import HaskellWorks.Data.RankSelect.Base.Rank1+import HaskellWorks.Data.RankSelect.Base.Select1+import Prelude                                        hiding (drop)++import qualified Data.Attoparsec.ByteString.Char8 as ABC++jsonTokenAt :: (Rank1 w, Select1 v, TestBit w) => JsonCursor ByteString v w -> Maybe (JsonToken String Double)+jsonTokenAt k = if balancedParens k .?. lastPositionOf (cursorRank k)+  then case ABC.parse parseJsonToken (drop (toCount (jsonCursorPos k)) (cursorText k)) of+    ABC.Fail    {}  -> error "Failed to parse token in cursor"+    ABC.Partial _   -> error "Failed to parse token in cursor"+    ABC.Done    _ r -> Just r+  else Nothing
+ src/HaskellWorks/Data/Json/Internal/IbBp.hs view
@@ -0,0 +1,24 @@+module HaskellWorks.Data.Json.Internal.IbBp where++import Data.Word++import qualified Data.ByteString                                    as BS+import qualified Data.Vector.Storable                               as DVS+import qualified HaskellWorks.Data.Json.Internal.BlankedJson        as J+import qualified HaskellWorks.Data.Json.Internal.ToBalancedParens64 as J+import qualified HaskellWorks.Data.Json.Internal.ToInterestBits64   as J++data IbBp = IbBp+  { ib :: DVS.Vector Word64+  , bp :: DVS.Vector Word64+  }++class ToIbBp a where+  toIbBp :: a -> IbBp++instance ToIbBp BS.ByteString where+  toIbBp bs = IbBp+    { ib = J.toInterestBits64 blankedJson+    , bp = J.toBalancedParens64 blankedJson+    }+    where blankedJson = J.toBlankedJsonTyped bs
+ src/HaskellWorks/Data/Json/Internal/Index.hs view
@@ -0,0 +1,61 @@+{-# LANGUAGE BangPatterns          #-}+{-# LANGUAGE FlexibleContexts      #-}+{-# LANGUAGE FlexibleInstances     #-}+{-# LANGUAGE InstanceSigs          #-}+{-# LANGUAGE MultiParamTypeClasses #-}++module HaskellWorks.Data.Json.Internal.Index where++import Control.Arrow+import Control.Monad+import HaskellWorks.Data.Bits.BitWise+import HaskellWorks.Data.Drop+import HaskellWorks.Data.Json.Cursor+import HaskellWorks.Data.Json.DecodeError+import HaskellWorks.Data.Json.Internal.CharLike+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 qualified Data.ByteString                  as BS+import qualified Data.List                        as L+import qualified HaskellWorks.Data.BalancedParens as BP++data JsonIndex+  = JsonIndexString BS.ByteString+  | JsonIndexNumber BS.ByteString+  | JsonIndexObject [(BS.ByteString, JsonIndex)]+  | JsonIndexArray [JsonIndex]+  | JsonIndexBool Bool+  | JsonIndexNull+  deriving (Eq, Show)++class JsonIndexAt a where+  jsonIndexAt :: a -> Either DecodeError JsonIndex++instance (BP.BalancedParens w, Rank0 w, Rank1 w, Select1 v, TestBit w) => JsonIndexAt (JsonCursor BS.ByteString v w) where+  jsonIndexAt k = case uncons remainder of+    Just (!c, _) | isLeadingDigit2 c  -> Right (JsonIndexNumber  remainder)+    Just (!c, _) | isQuotDbl c        -> Right (JsonIndexString  remainder)+    Just (!c, _) | isChar_t c         -> Right (JsonIndexBool    True)+    Just (!c, _) | isChar_f c         -> Right (JsonIndexBool    False)+    Just (!c, _) | isChar_n c         -> Right  JsonIndexNull+    Just (!c, _) | isBraceLeft c      -> JsonIndexObject <$> mapValuesFrom   (firstChild k)+    Just (!c, _) | isBracketLeft c    -> JsonIndexArray  <$> arrayValuesFrom (firstChild k)+    Just _       -> Left (DecodeError "Invalid Json Type")+    Nothing      -> Left (DecodeError "End of data"      )+    where ik                = interests k+          bpk               = balancedParens k+          p                 = lastPositionOf (select1 ik (rank1 bpk (cursorRank k)))+          remainder         = drop (toCount p) (cursorText k)+          arrayValuesFrom j = sequence (L.unfoldr (fmap (jsonIndexAt &&& nextSibling)) j)+          mapValuesFrom j   = (pairwise >=> asField) <$> arrayValuesFrom j+          pairwise (a:b:rs) = (a, b) : pairwise rs+          pairwise _        = []+          asField (a, b)    = case a of+                                JsonIndexString s -> [(s, b)]+                                _                 -> []
src/HaskellWorks/Data/Json/Internal/MakeIndex.hs view
@@ -5,7 +5,6 @@   ( blankedJsonToInterestBits   , byteStringToBits   , blankedJsonToBalancedParens-  , blankedJsonToBalancedParens2   , compressWordAsBit   , interestingWord8s   ) where@@ -57,29 +56,6 @@                     , BS.drop 8 ds                     ) -blankedJsonToBalancedParens :: [BS.ByteString] -> [Bool]-blankedJsonToBalancedParens (as) = case as of-    (bs:bss) -> blankedJsonToBalancedParens' bs bss []-    []       -> []--blankedJsonToBalancedParens' :: BS.ByteString -> [BS.ByteString] -> ([Bool] -> [Bool])-blankedJsonToBalancedParens' bs = case BS.uncons bs of-  Just (c, cs) -> do-    let t = case c of-          d | d == _braceleft     -> (True:)-          d | d == _braceright    -> (False:)-          d | d == _bracketleft   -> (True:)-          d | d == _bracketright  -> (False:)-          d | d == _parenleft     -> (True:)-          d | d == _parenright    -> (False:)-          d | d == _t             -> (True:) . (False:)-          d | d == _f             -> (True:) . (False:)-          d | d == _1             -> (True:) . (False:)-          d | d == _n             -> (True:) . (False:)-          _ -> id-    (t .) . blankedJsonToBalancedParens' cs-  Nothing -> const id- repartitionMod8 :: BS.ByteString -> BS.ByteString -> (BS.ByteString, BS.ByteString) repartitionMod8 aBS bBS = (BS.take cLen abBS, BS.drop cLen abBS)   where abBS = BS.concat [aBS, bBS]@@ -105,11 +81,11 @@                     , BS.drop 8 xs                     ) -blankedJsonToBalancedParens2 :: [BS.ByteString] -> [BS.ByteString]-blankedJsonToBalancedParens2 as = case as of+blankedJsonToBalancedParens :: [BS.ByteString] -> [BS.ByteString]+blankedJsonToBalancedParens as = case as of   (bs:bss) ->     let (cs, _) = BS.unfoldrN (BS.length bs * 2) gen (Nothing, bs) in-    cs:blankedJsonToBalancedParens2 bss+    cs:blankedJsonToBalancedParens bss   [] -> []   where gen :: (Maybe Bool, ByteString) -> Maybe (Word8, (Maybe Bool, ByteString))         gen (Just True  , bs) = Just (0xFF, (Nothing, bs))
+ src/HaskellWorks/Data/Json/Internal/PartialIndex.hs view
@@ -0,0 +1,62 @@+{-# LANGUAGE BangPatterns          #-}+{-# LANGUAGE FlexibleContexts      #-}+{-# LANGUAGE FlexibleInstances     #-}+{-# LANGUAGE InstanceSigs          #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE ScopedTypeVariables   #-}++module HaskellWorks.Data.Json.Internal.PartialIndex where++import Control.Arrow+import HaskellWorks.Data.Bits.BitWise+import HaskellWorks.Data.Drop+import HaskellWorks.Data.Json.Cursor+import HaskellWorks.Data.Json.Internal.CharLike+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 qualified Data.ByteString                  as BS+import qualified Data.List                        as L+import qualified HaskellWorks.Data.BalancedParens as BP++data JsonPartialIndex+  = JsonPartialIndexString BS.ByteString+  | JsonPartialIndexNumber BS.ByteString+  | JsonPartialIndexObject [(BS.ByteString, JsonPartialIndex)]+  | JsonPartialIndexArray [JsonPartialIndex]+  | JsonPartialIndexBool Bool+  | JsonPartialIndexNull+  | JsonPartialIndexError String+  deriving (Eq, Show)++class JsonPartialIndexAt a where+  jsonPartialIndexAt :: a -> JsonPartialIndex++instance (BP.BalancedParens w, Rank0 w, Rank1 w, Select1 v, TestBit w) => JsonPartialIndexAt (JsonCursor BS.ByteString v w) where+  jsonPartialIndexAt k = case uncons remainder of+    Just (!c, _) | isLeadingDigit2 c  -> JsonPartialIndexNumber  remainder+    Just (!c, _) | isQuotDbl c        -> JsonPartialIndexString  remainder+    Just (!c, _) | isChar_t c         -> JsonPartialIndexBool    True+    Just (!c, _) | isChar_f c         -> JsonPartialIndexBool    False+    Just (!c, _) | isChar_n c         -> JsonPartialIndexNull+    Just (!c, _) | isBraceLeft c      -> JsonPartialIndexObject (mapValuesFrom   (firstChild k))+    Just (!c, _) | isBracketLeft c    -> JsonPartialIndexArray  (arrayValuesFrom (firstChild k))+    Just _       -> JsonPartialIndexError "Invalid Json Type"+    Nothing      -> JsonPartialIndexError "End of data"+    where ik                = interests k+          bpk               = balancedParens k+          p                 = lastPositionOf (select1 ik (rank1 bpk (cursorRank k)))+          remainder         = drop (toCount p) (cursorText k)+          arrayValuesFrom :: Maybe (JsonCursor BS.ByteString v w) -> [JsonPartialIndex]+          arrayValuesFrom = L.unfoldr (fmap (jsonPartialIndexAt &&& nextSibling))+          mapValuesFrom j   = pairwise (arrayValuesFrom j) >>= asField+          pairwise (a:b:rs) = (a, b) : pairwise rs+          pairwise _        = []+          asField (a, b)    = case a of+                                JsonPartialIndexString s -> [(s, b)]+                                _                        -> []
+ src/HaskellWorks/Data/Json/Internal/ToBalancedParens64.hs view
@@ -0,0 +1,28 @@+{-# LANGUAGE FlexibleContexts      #-}+{-# LANGUAGE FlexibleInstances     #-}+{-# LANGUAGE InstanceSigs          #-}+{-# LANGUAGE MultiParamTypeClasses #-}++module HaskellWorks.Data.Json.Internal.ToBalancedParens64+  ( ToBalancedParens64(..)+  ) where++import Control.Applicative+import Data.Word+import HaskellWorks.Data.Json.Internal.MakeIndex++import qualified Data.ByteString.Lazy                        as LBS+import qualified Data.Vector.Storable                        as DVS+import qualified HaskellWorks.Data.Json.Internal.BlankedJson as J++genBitWordsForever :: LBS.ByteString -> Maybe (Word8, LBS.ByteString)+genBitWordsForever bs = LBS.uncons bs <|> Just (0, bs)+{-# INLINE genBitWordsForever #-}++class ToBalancedParens64 a where+  toBalancedParens64 :: a -> DVS.Vector Word64++instance ToBalancedParens64 J.BlankedJson where+  toBalancedParens64 (J.BlankedJson bj) = DVS.unsafeCast (DVS.unfoldrN newLen genBitWordsForever bpBS)+    where bpBS    = LBS.fromChunks (compressWordAsBit (blankedJsonToBalancedParens bj))+          newLen  = fromIntegral ((LBS.length bpBS + 7) `div` 8 * 8)
+ src/HaskellWorks/Data/Json/Internal/ToInterestBits64.hs view
@@ -0,0 +1,31 @@+{-# LANGUAGE FlexibleContexts      #-}+{-# LANGUAGE FlexibleInstances     #-}+{-# LANGUAGE InstanceSigs          #-}+{-# LANGUAGE MultiParamTypeClasses #-}++module HaskellWorks.Data.Json.Internal.ToInterestBits64+  ( ToInterestBits64(..)+  ) where++import Control.Applicative+import Data.ByteString.Internal+import Data.Word+import HaskellWorks.Data.Json.Internal.MakeIndex++import qualified Data.ByteString                             as BS+import qualified Data.Vector.Storable                        as DVS+import qualified HaskellWorks.Data.Json.Internal.BlankedJson as J++class ToInterestBits64 a where+  toInterestBits64 :: a -> DVS.Vector Word64++instance ToInterestBits64 J.BlankedJson where+  toInterestBits64 bj = DVS.unsafeCast (DVS.unfoldrN newLen genInterestForever interestBS)+    where interestBS    = blankedJsonBssToInterestBitsBs (J.unBlankedJson bj)+          newLen        = (BS.length interestBS + 7) `div` 8 * 8++blankedJsonBssToInterestBitsBs :: [ByteString] -> ByteString+blankedJsonBssToInterestBitsBs bss = BS.concat $ blankedJsonToInterestBits bss++genInterestForever :: ByteString -> Maybe (Word8, ByteString)+genInterestForever bs = BS.uncons bs <|> Just (0, bs)
+ src/HaskellWorks/Data/Json/Internal/Token.hs view
@@ -0,0 +1,5 @@+module HaskellWorks.Data.Json.Internal.Token+  ( module X+  ) where++import HaskellWorks.Data.Json.Internal.Token.Tokenize as X
+ src/HaskellWorks/Data/Json/Internal/Token/Tokenize.hs view
@@ -0,0 +1,165 @@+{-# LANGUAGE FlexibleContexts      #-}+{-# LANGUAGE FlexibleInstances     #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedStrings     #-}+{-# LANGUAGE TypeSynonymInstances  #-}++module HaskellWorks.Data.Json.Internal.Token.Tokenize+    ( IsChar(..)+    , JsonToken(..)+    , ParseJson(..)+    ) where++import Control.Applicative+import Data.Bits+import Data.Char+import Data.Word+import Data.Word8+import HaskellWorks.Data.Char.IsChar+import HaskellWorks.Data.Json.Internal.Token.Types+import HaskellWorks.Data.Parser                    ((<?>))++import qualified Data.Attoparsec.ByteString.Char8 as BC+import qualified Data.Attoparsec.Combinator       as AC+import qualified Data.Attoparsec.Types            as T+import qualified Data.ByteString                  as BS+import qualified HaskellWorks.Data.Parser         as P++hexDigitNumeric :: P.Parser t u => T.Parser t Int+hexDigitNumeric = do+  c <- P.satisfyChar (\c -> '0' <= c && c <= '9')+  return $ ord c - ord '0'++hexDigitAlphaLower :: P.Parser t u => T.Parser t Int+hexDigitAlphaLower = do+  c <- P.satisfyChar (\c -> 'a' <= c && c <= 'z')+  return $ ord c - ord 'a' + 10++hexDigitAlphaUpper :: P.Parser t u => T.Parser t Int+hexDigitAlphaUpper = do+  c <- P.satisfyChar (\c -> 'A' <= c && c <= 'Z')+  return $ ord c - ord 'A' + 10++hexDigit :: P.Parser t u => T.Parser t Int+hexDigit = hexDigitNumeric <|> hexDigitAlphaLower <|> hexDigitAlphaUpper++class ParseJson t s d where+  parseJsonTokenString :: T.Parser t (JsonToken s d)+  parseJsonToken :: T.Parser t (JsonToken s d)+  parseJsonTokenBraceL :: T.Parser t (JsonToken s d)+  parseJsonTokenBraceR :: T.Parser t (JsonToken s d)+  parseJsonTokenBracketL :: T.Parser t (JsonToken s d)+  parseJsonTokenBracketR :: T.Parser t (JsonToken s d)+  parseJsonTokenComma :: T.Parser t (JsonToken s d)+  parseJsonTokenColon :: T.Parser t (JsonToken s d)+  parseJsonTokenWhitespace :: T.Parser t (JsonToken s d)+  parseJsonTokenNull :: T.Parser t (JsonToken s d)+  parseJsonTokenBoolean :: T.Parser t (JsonToken s d)+  parseJsonTokenDouble :: T.Parser t (JsonToken s d)++  parseJsonToken =+    parseJsonTokenString     <|>+    parseJsonTokenBraceL     <|>+    parseJsonTokenBraceR     <|>+    parseJsonTokenBracketL   <|>+    parseJsonTokenBracketR   <|>+    parseJsonTokenComma      <|>+    parseJsonTokenColon      <|>+    parseJsonTokenWhitespace <|>+    parseJsonTokenNull       <|>+    parseJsonTokenBoolean    <|>+    parseJsonTokenDouble++instance ParseJson BS.ByteString String Double where+  parseJsonTokenBraceL    = P.string "{" >> return JsonTokenBraceL+  parseJsonTokenBraceR    = P.string "}" >> return JsonTokenBraceR+  parseJsonTokenBracketL  = P.string "[" >> return JsonTokenBracketL+  parseJsonTokenBracketR  = P.string "]" >> return JsonTokenBracketR+  parseJsonTokenComma     = P.string "," >> return JsonTokenComma+  parseJsonTokenColon     = P.string ":" >> return JsonTokenColon+  parseJsonTokenNull      = P.string "null" >> return JsonTokenNull+  parseJsonTokenDouble    = JsonTokenNumber <$> P.rational++  parseJsonTokenString = do+    _ <- P.string "\""+    value <- many (verbatimChar <|> escapedChar <|> escapedCode)+    _ <- P.string "\""+    return $ JsonTokenString value+    where+      verbatimChar  = P.satisfyChar (BC.notInClass "\"\\") <?> "invalid string character"+      escapedChar   = do+        _ <- P.string "\\"+        (   P.char '"'  >> return '"'  ) <|>+          ( P.char 'b'  >> return '\b' ) <|>+          ( P.char 'n'  >> return '\n' ) <|>+          ( P.char 'f'  >> return '\f' ) <|>+          ( P.char 'r'  >> return '\r' ) <|>+          ( P.char 't'  >> return '\t' ) <|>+          ( P.char '\\' >> return '\\' ) <|>+          ( P.char '\'' >> return '\'' ) <|>+          ( P.char '/'  >> return '/'  )+      escapedCode   = do+        _ <- P.string "\\u"+        a <- hexDigit+        b <- hexDigit+        c <- hexDigit+        d <- hexDigit+        return $ chr $ a `shift` 24 .|. b `shift` 16 .|. c `shift` 8 .|. d++  parseJsonTokenWhitespace = do+    _ <- AC.many1' $ BC.choice [P.string " ", P.string "\t", P.string "\n", P.string "\r"]+    return JsonTokenWhitespace++  parseJsonTokenBoolean = true <|> false+    where true  = P.string "true"   >> return (JsonTokenBoolean True)+          false = P.string "false"  >> return (JsonTokenBoolean False)++instance ParseJson BS.ByteString BS.ByteString Double where+  parseJsonTokenBraceL    = P.string "{" >> return JsonTokenBraceL+  parseJsonTokenBraceR    = P.string "}" >> return JsonTokenBraceR+  parseJsonTokenBracketL  = P.string "[" >> return JsonTokenBracketL+  parseJsonTokenBracketR  = P.string "]" >> return JsonTokenBracketR+  parseJsonTokenComma     = P.string "," >> return JsonTokenComma+  parseJsonTokenColon     = P.string ":" >> return JsonTokenColon+  parseJsonTokenNull      = P.string "null" >> return JsonTokenNull+  parseJsonTokenDouble    = JsonTokenNumber <$> P.rational++  parseJsonTokenString = do+    _ <- P.string "\""+    value <- many (verbatimChar <|> escapedChar <|> escapedCode)+    _ <- P.string "\""+    return $ JsonTokenString $ BS.pack value+    where+      word :: Word8 -> T.Parser BS.ByteString Word8+      word w = P.satisfy (== w)+      verbatimChar :: T.Parser BS.ByteString Word8+      verbatimChar  = P.satisfy (\w -> w /= _quotedbl && w /= _backslash) -- <?> "invalid string character"+      escapedChar :: T.Parser BS.ByteString Word8+      escapedChar   = do+        _ <- P.string "\\"+        (   word _quotedbl    >> return _quotedbl       ) <|>+          ( word _b           >> return 0x08            ) <|>+          ( word _n           >> return _lf             ) <|>+          ( word _f           >> return _np             ) <|>+          ( word _r           >> return _cr             ) <|>+          ( word _t           >> return _tab            ) <|>+          ( word _backslash   >> return _backslash      ) <|>+          ( word _quotesingle >> return _quotesingle    ) <|>+          ( word _slash       >> return _slash          )+      escapedCode :: T.Parser BS.ByteString Word8+      escapedCode   = do+        _ <- P.string "\\u"+        a <- hexDigit+        b <- hexDigit+        c <- hexDigit+        d <- hexDigit+        return $ fromIntegral $ a `shift` 24 .|. b `shift` 16 .|. c `shift` 8 .|. d++  parseJsonTokenWhitespace = do+    _ <- AC.many1' $ BC.choice [P.string " ", P.string "\t", P.string "\n", P.string "\r"]+    return JsonTokenWhitespace++  parseJsonTokenBoolean = true <|> false+    where+      true  = P.string "true"   >> return (JsonTokenBoolean True)+      false = P.string "false"  >> return (JsonTokenBoolean False)
+ src/HaskellWorks/Data/Json/Internal/Token/Types.hs view
@@ -0,0 +1,15 @@+module HaskellWorks.Data.Json.Internal.Token.Types (JsonToken(..)) where++data JsonToken s d+  = JsonTokenBraceL+  | JsonTokenBraceR+  | JsonTokenBracketL+  | JsonTokenBracketR+  | JsonTokenComma+  | JsonTokenColon+  | JsonTokenWhitespace+  | JsonTokenString s+  | JsonTokenBoolean Bool+  | JsonTokenNumber d+  | JsonTokenNull+  deriving (Eq, Show)
+ src/HaskellWorks/Data/Json/Internal/Value.hs view
@@ -0,0 +1,63 @@+{-# LANGUAGE FlexibleContexts      #-}+{-# LANGUAGE FlexibleInstances     #-}+{-# LANGUAGE InstanceSigs          #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedStrings     #-}+{-# LANGUAGE ScopedTypeVariables   #-}+{-# LANGUAGE TupleSections         #-}++module HaskellWorks.Data.Json.Internal.Value where++import Control.Applicative+import Data.Bits+import Data.Char+import Data.String+import HaskellWorks.Data.Parser as P++import qualified Data.Attoparsec.ByteString.Char8 as ABC+import qualified Data.Attoparsec.Types            as T++parseHexDigitNumeric :: P.Parser t u => T.Parser t Int+parseHexDigitNumeric = do+  c <- satisfyChar (\c -> '0' <= c && c <= '9')+  return $ ord c - ord '0'++parseHexDigitAlphaLower :: P.Parser t u => T.Parser t Int+parseHexDigitAlphaLower = do+  c <- satisfyChar (\c -> 'a' <= c && c <= 'z')+  return $ ord c - ord 'a' + 10++parseHexDigitAlphaUpper :: P.Parser t u => T.Parser t Int+parseHexDigitAlphaUpper = do+  c <- satisfyChar (\c -> 'A' <= c && c <= 'Z')+  return $ ord c - ord 'A' + 10++parseHexDigit :: P.Parser t u => T.Parser t Int+parseHexDigit = parseHexDigitNumeric <|> parseHexDigitAlphaLower <|> parseHexDigitAlphaUpper++parseJsonString :: (P.Parser t u, IsString t) => T.Parser t String+parseJsonString = do+  _ <- string "\""+  value <- many (verbatimChar <|> escapedChar <|> escapedCode)+  _ <- string "\""+  return value+  where+    verbatimChar  = satisfyChar (ABC.notInClass "\"\\") <?> "invalid string character"+    escapedChar   = do+      _ <- string "\\"+      (   char '"'  >> return '"'  ) <|>+        ( char 'b'  >> return '\b' ) <|>+        ( char 'n'  >> return '\n' ) <|>+        ( char 'f'  >> return '\f' ) <|>+        ( char 'r'  >> return '\r' ) <|>+        ( char 't'  >> return '\t' ) <|>+        ( char '\\' >> return '\\' ) <|>+        ( char '\'' >> return '\'' ) <|>+        ( char '/'  >> return '/'  )+    escapedCode   = do+      _ <- string "\\u"+      a <- parseHexDigit+      b <- parseHexDigit+      c <- parseHexDigit+      d <- parseHexDigit+      return $ chr $ a `shift` 24 .|. b `shift` 16 .|. c `shift` 8 .|. d
src/HaskellWorks/Data/Json/Internal/Words.hs view
@@ -11,3 +11,6 @@  isAlphabetic :: Word8 -> Bool isAlphabetic w = (w >= _A && w <= _Z) || (w >= _a && w <= _z)++wIsJsonNumberDigit :: Word8 -> Bool+wIsJsonNumberDigit w = (w >= _0 && w <= _9) || w == _hyphen
src/HaskellWorks/Data/Json/LightJson.hs view
@@ -16,8 +16,8 @@ import HaskellWorks.Data.Bits.BitWise import HaskellWorks.Data.Drop import HaskellWorks.Data.Entry-import HaskellWorks.Data.Json.CharLike import HaskellWorks.Data.Json.Cursor+import HaskellWorks.Data.Json.Internal.CharLike import HaskellWorks.Data.Json.Internal.Words import HaskellWorks.Data.Micro import HaskellWorks.Data.Mini
src/HaskellWorks/Data/Json/Load.hs view
@@ -25,9 +25,9 @@ import HaskellWorks.Data.FromForeignRegion import HaskellWorks.Data.Json.Cursor import HaskellWorks.Data.Json.DecodeError+import HaskellWorks.Data.Json.Internal.Index+import HaskellWorks.Data.Json.Internal.PartialIndex import HaskellWorks.Data.Json.PartialValue-import HaskellWorks.Data.Json.Succinct.Index-import HaskellWorks.Data.Json.Succinct.PartialIndex import HaskellWorks.Data.Json.Value import HaskellWorks.Data.RankSelect.CsPoppy import HaskellWorks.Data.RankSelect.Poppy512@@ -50,11 +50,11 @@ writeVector :: forall a. Storable a => FilePath -> DVS.Vector a -> IO () writeVector fp v = withFile fp WriteMode $ \h -> hPutVector h v -readJson :: String -> IO (JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64)))+readJson :: String -> IO (JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64))) readJson path = do   bs <- loadByteString path   putStrLn "Read file"-  let !cursor = fromByteString bs :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64))+  let !cursor = fromByteString bs :: JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64))   putStrLn "Created cursor"   return cursor @@ -111,7 +111,7 @@  indexJson :: String -> IO () indexJson filename = do-  JsonCursor _ (BitShown ib) (SimpleBalancedParens bp) _ <- readJson filename+  JsonCursor _ ib (SimpleBalancedParens bp) _ <- readJson filename   let wib = DVS.unsafeCast ib :: DVS.Vector Word8   let wbp = DVS.unsafeCast bp :: DVS.Vector Word8   writeVector (filename ++ ".ib") wib
src/HaskellWorks/Data/Json/LoadCursor.hs view
@@ -18,12 +18,11 @@ import Foreign.Ptr import Foreign.Storable import HaskellWorks.Data.BalancedParens.Simple-import HaskellWorks.Data.Bits.BitShown import HaskellWorks.Data.FromByteString import HaskellWorks.Data.FromForeignRegion import HaskellWorks.Data.Json.Cursor import HaskellWorks.Data.Json.DecodeError-import HaskellWorks.Data.Json.Succinct.Index+import HaskellWorks.Data.Json.Internal.Index import HaskellWorks.Data.Json.Value import HaskellWorks.Data.RankSelect.CsPoppy import HaskellWorks.Data.RankSelect.Poppy512@@ -46,11 +45,11 @@ writeVector :: forall a. Storable a => FilePath -> DVS.Vector a -> IO () writeVector fp v = withFile fp WriteMode $ \h -> hPutVector h v -readJson :: String -> IO (JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64)))+readJson :: String -> IO (JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64))) readJson path = do   bs <- BS.readFile path   putStrLn "Read file"-  let !cursor = fromByteString bs :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64))+  let !cursor = fromByteString bs :: JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64))   putStrLn "Created cursor"   return cursor @@ -76,10 +75,10 @@   let jsonBp  = fromForeignRegion jsonBpFr  :: DVS.Vector Word64   return (jsonBS, jsonIb, jsonBp) -loadJsonWithIndex :: String -> IO (JsonCursor BSI.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64)))+loadJsonWithIndex :: String -> IO (JsonCursor BSI.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64))) loadJsonWithIndex filename = do   (jsonBS, jsonIb, jsonBp) <- loadJsonRawWithIndex filename-  let cursor = JsonCursor jsonBS (BitShown jsonIb) (SimpleBalancedParens jsonBp) 1+  let cursor = JsonCursor jsonBS jsonIb (SimpleBalancedParens jsonBp) 1   return cursor  loadJsonWithPoppy512Index :: String -> IO (JsonCursor BSI.ByteString Poppy512 (SimpleBalancedParens (DVS.Vector Word64)))@@ -103,7 +102,7 @@  indexJsonCursor :: String -> IO () indexJsonCursor filename = do-  JsonCursor _ (BitShown ib) (SimpleBalancedParens bp) _ <- readJson filename+  JsonCursor _  ib (SimpleBalancedParens bp) _ <- readJson filename   let wib = DVS.unsafeCast ib :: DVS.Vector Word8   let wbp = DVS.unsafeCast bp :: DVS.Vector Word8   writeVector (filename ++ ".ib") wib
src/HaskellWorks/Data/Json/PartialValue.hs view
@@ -25,8 +25,8 @@ import HaskellWorks.Data.Bits.BitWise import HaskellWorks.Data.Entry import HaskellWorks.Data.Json.Cursor-import HaskellWorks.Data.Json.Succinct.PartialIndex-import HaskellWorks.Data.Json.Value.Internal+import HaskellWorks.Data.Json.Internal.PartialIndex+import HaskellWorks.Data.Json.Internal.Value import HaskellWorks.Data.Micro import HaskellWorks.Data.Mini import HaskellWorks.Data.MQuery
− src/HaskellWorks/Data/Json/Succinct/Cursor/BalancedParens.hs
@@ -1,50 +0,0 @@-{-# LANGUAGE FlexibleContexts      #-}-{-# LANGUAGE FlexibleInstances     #-}-{-# LANGUAGE InstanceSigs          #-}-{-# LANGUAGE MultiParamTypeClasses #-}--module HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens-  ( JsonBalancedParens(..)-  , getJsonBalancedParens-  ) where--import Control.Applicative-import Data.Word-import HaskellWorks.Data.BalancedParens                   as BP-import HaskellWorks.Data.Json.Internal.MakeIndex-import HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson--import qualified Data.ByteString      as BS-import qualified Data.Vector.Storable as DVS--newtype JsonBalancedParens a = JsonBalancedParens a--getJsonBalancedParens :: JsonBalancedParens a -> a-getJsonBalancedParens (JsonBalancedParens a) = a--genBitWordsForever :: BS.ByteString -> Maybe (Word8, BS.ByteString)-genBitWordsForever bs = BS.uncons bs <|> Just (0, bs)-{-# INLINE genBitWordsForever #-}--instance FromBlankedJson (JsonBalancedParens (SimpleBalancedParens [Bool])) where-  fromBlankedJson (BlankedJson bj) = JsonBalancedParens (SimpleBalancedParens (blankedJsonToBalancedParens bj))--instance FromBlankedJson (JsonBalancedParens (SimpleBalancedParens (DVS.Vector Word8))) where-  fromBlankedJson bj  = JsonBalancedParens (SimpleBalancedParens (DVS.unsafeCast (DVS.unfoldrN newLen genBitWordsForever bpBS)))-    where bpBS        = BS.concat ((compressWordAsBit . blankedJsonToBalancedParens2) (getBlankedJson bj))-          newLen      = (BS.length bpBS + 7) `div` 8 * 8--instance FromBlankedJson (JsonBalancedParens (SimpleBalancedParens (DVS.Vector Word16))) where-  fromBlankedJson bj  = JsonBalancedParens (SimpleBalancedParens (DVS.unsafeCast (DVS.unfoldrN newLen genBitWordsForever bpBS)))-    where bpBS        = BS.concat ((compressWordAsBit . blankedJsonToBalancedParens2) (getBlankedJson bj))-          newLen      = (BS.length bpBS + 7) `div` 8 * 8--instance FromBlankedJson (JsonBalancedParens (SimpleBalancedParens (DVS.Vector Word32))) where-  fromBlankedJson bj  = JsonBalancedParens (SimpleBalancedParens (DVS.unsafeCast (DVS.unfoldrN newLen genBitWordsForever bpBS)))-    where bpBS        = BS.concat ((compressWordAsBit . blankedJsonToBalancedParens2) (getBlankedJson bj))-          newLen      = (BS.length bpBS + 7) `div` 8 * 8--instance FromBlankedJson (JsonBalancedParens (SimpleBalancedParens (DVS.Vector Word64))) where-  fromBlankedJson bj  = JsonBalancedParens (SimpleBalancedParens (DVS.unsafeCast (DVS.unfoldrN newLen genBitWordsForever bpBS)))-    where bpBS        = BS.concat ((compressWordAsBit . blankedJsonToBalancedParens2) (getBlankedJson bj))-          newLen      = (BS.length bpBS + 7) `div` 8 * 8
− src/HaskellWorks/Data/Json/Succinct/Cursor/BlankedJson.hs
@@ -1,23 +0,0 @@--module HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson-  ( BlankedJson(..)-  , FromBlankedJson(..)-  , getBlankedJson-  ) where--import HaskellWorks.Data.ByteString-import HaskellWorks.Data.FromByteString-import HaskellWorks.Data.Json.Internal.Blank--import qualified Data.ByteString as BS--newtype BlankedJson = BlankedJson [BS.ByteString] deriving (Eq, Show)--getBlankedJson :: BlankedJson -> [BS.ByteString]-getBlankedJson (BlankedJson bs) = bs--class FromBlankedJson a where-  fromBlankedJson :: BlankedJson -> a--instance FromByteString BlankedJson where-  fromByteString bs = BlankedJson (blankJson (chunkedBy 4064 bs))
− src/HaskellWorks/Data/Json/Succinct/Cursor/InterestBits.hs
@@ -1,62 +0,0 @@-{-# LANGUAGE FlexibleContexts      #-}-{-# LANGUAGE FlexibleInstances     #-}-{-# LANGUAGE InstanceSigs          #-}-{-# LANGUAGE MultiParamTypeClasses #-}--module HaskellWorks.Data.Json.Succinct.Cursor.InterestBits-  ( JsonInterestBits(..)-  , getJsonInterestBits-  ) where--import Control.Applicative-import Data.ByteString.Internal-import Data.Word-import HaskellWorks.Data.Bits.BitShown-import HaskellWorks.Data.FromByteString-import HaskellWorks.Data.Json.Internal.MakeIndex-import HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson-import HaskellWorks.Data.RankSelect.Poppy512--import qualified Data.ByteString      as BS-import qualified Data.Vector.Storable as DVS--newtype JsonInterestBits a = JsonInterestBits a--getJsonInterestBits :: JsonInterestBits a -> a-getJsonInterestBits (JsonInterestBits a) = a--blankedJsonBssToInterestBitsBs :: [ByteString] -> ByteString-blankedJsonBssToInterestBitsBs bss = BS.concat $ blankedJsonToInterestBits bss--genInterest :: ByteString -> Maybe (Word8, ByteString)-genInterest = BS.uncons--genInterestForever :: ByteString -> Maybe (Word8, ByteString)-genInterestForever bs = BS.uncons bs <|> Just (0, bs)--instance FromBlankedJson (JsonInterestBits (BitShown [Bool])) where-  fromBlankedJson = JsonInterestBits . fromByteString . BS.concat . blankedJsonToInterestBits . getBlankedJson--instance FromBlankedJson (JsonInterestBits (BitShown BS.ByteString)) where-  fromBlankedJson = JsonInterestBits . BitShown . BS.unfoldr genInterest . blankedJsonBssToInterestBitsBs . getBlankedJson--instance FromBlankedJson (JsonInterestBits (BitShown (DVS.Vector Word8))) where-  fromBlankedJson = JsonInterestBits . BitShown . DVS.unfoldr genInterest . blankedJsonBssToInterestBitsBs . getBlankedJson--instance FromBlankedJson (JsonInterestBits (BitShown (DVS.Vector Word16))) where-  fromBlankedJson bj = JsonInterestBits (BitShown (DVS.unsafeCast (DVS.unfoldrN newLen genInterestForever interestBS)))-    where interestBS    = blankedJsonBssToInterestBitsBs (getBlankedJson bj)-          newLen        = (BS.length interestBS + 1) `div` 2 * 2--instance FromBlankedJson (JsonInterestBits (BitShown (DVS.Vector Word32))) where-  fromBlankedJson bj = JsonInterestBits (BitShown (DVS.unsafeCast (DVS.unfoldrN newLen genInterestForever interestBS)))-    where interestBS    = blankedJsonBssToInterestBitsBs (getBlankedJson bj)-          newLen        = (BS.length interestBS + 3) `div` 4 * 4--instance FromBlankedJson (JsonInterestBits (BitShown (DVS.Vector Word64))) where-  fromBlankedJson bj    = JsonInterestBits (BitShown (DVS.unsafeCast (DVS.unfoldrN newLen genInterestForever interestBS)))-    where interestBS    = blankedJsonBssToInterestBitsBs (getBlankedJson bj)-          newLen        = (BS.length interestBS + 7) `div` 8 * 8--instance FromBlankedJson (JsonInterestBits Poppy512) where-  fromBlankedJson = JsonInterestBits . makePoppy512 . bitShown . getJsonInterestBits . fromBlankedJson
− src/HaskellWorks/Data/Json/Succinct/Cursor/Token.hs
@@ -1,24 +0,0 @@--module HaskellWorks.Data.Json.Succinct.Cursor.Token-  ( jsonTokenAt-  ) where--import Data.ByteString.Internal                  as BSI-import HaskellWorks.Data.Bits.BitWise-import HaskellWorks.Data.Drop-import HaskellWorks.Data.Json.Cursor-import HaskellWorks.Data.Json.Token.Tokenize-import HaskellWorks.Data.Positioning-import HaskellWorks.Data.RankSelect.Base.Rank1-import HaskellWorks.Data.RankSelect.Base.Select1-import Prelude                                   hiding (drop)--import qualified Data.Attoparsec.ByteString.Char8 as ABC--jsonTokenAt :: (Rank1 w, Select1 v, TestBit w) => JsonCursor ByteString v w -> Maybe (JsonToken String Double)-jsonTokenAt k = if balancedParens k .?. lastPositionOf (cursorRank k)-  then case ABC.parse parseJsonToken (drop (toCount (jsonCursorPos k)) (cursorText k)) of-    ABC.Fail    {}  -> error "Failed to parse token in cursor"-    ABC.Partial _   -> error "Failed to parse token in cursor"-    ABC.Done    _ r -> Just r-  else Nothing
− src/HaskellWorks/Data/Json/Succinct/Index.hs
@@ -1,61 +0,0 @@-{-# LANGUAGE BangPatterns          #-}-{-# LANGUAGE FlexibleContexts      #-}-{-# LANGUAGE FlexibleInstances     #-}-{-# LANGUAGE InstanceSigs          #-}-{-# LANGUAGE MultiParamTypeClasses #-}--module HaskellWorks.Data.Json.Succinct.Index where--import Control.Arrow-import Control.Monad-import HaskellWorks.Data.Bits.BitWise-import HaskellWorks.Data.Drop-import HaskellWorks.Data.Json.CharLike-import HaskellWorks.Data.Json.Cursor-import HaskellWorks.Data.Json.DecodeError-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 qualified Data.ByteString                  as BS-import qualified Data.List                        as L-import qualified HaskellWorks.Data.BalancedParens as BP--data JsonIndex-  = JsonIndexString BS.ByteString-  | JsonIndexNumber BS.ByteString-  | JsonIndexObject [(BS.ByteString, JsonIndex)]-  | JsonIndexArray [JsonIndex]-  | JsonIndexBool Bool-  | JsonIndexNull-  deriving (Eq, Show)--class JsonIndexAt a where-  jsonIndexAt :: a -> Either DecodeError JsonIndex--instance (BP.BalancedParens w, Rank0 w, Rank1 w, Select1 v, TestBit w) => JsonIndexAt (JsonCursor BS.ByteString v w) where-  jsonIndexAt k = case uncons remainder of-    Just (!c, _) | isLeadingDigit2 c  -> Right (JsonIndexNumber  remainder)-    Just (!c, _) | isQuotDbl c        -> Right (JsonIndexString  remainder)-    Just (!c, _) | isChar_t c         -> Right (JsonIndexBool    True)-    Just (!c, _) | isChar_f c         -> Right (JsonIndexBool    False)-    Just (!c, _) | isChar_n c         -> Right  JsonIndexNull-    Just (!c, _) | isBraceLeft c      -> JsonIndexObject <$> mapValuesFrom   (firstChild k)-    Just (!c, _) | isBracketLeft c    -> JsonIndexArray  <$> arrayValuesFrom (firstChild k)-    Just _       -> Left (DecodeError "Invalid Json Type")-    Nothing      -> Left (DecodeError "End of data"      )-    where ik                = interests k-          bpk               = balancedParens k-          p                 = lastPositionOf (select1 ik (rank1 bpk (cursorRank k)))-          remainder         = drop (toCount p) (cursorText k)-          arrayValuesFrom j = sequence (L.unfoldr (fmap (jsonIndexAt &&& nextSibling)) j)-          mapValuesFrom j   = (pairwise >=> asField) <$> arrayValuesFrom j-          pairwise (a:b:rs) = (a, b) : pairwise rs-          pairwise _        = []-          asField (a, b)    = case a of-                                JsonIndexString s -> [(s, b)]-                                _                 -> []
− src/HaskellWorks/Data/Json/Succinct/PartialIndex.hs
@@ -1,62 +0,0 @@-{-# LANGUAGE BangPatterns          #-}-{-# LANGUAGE FlexibleContexts      #-}-{-# LANGUAGE FlexibleInstances     #-}-{-# LANGUAGE InstanceSigs          #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables   #-}--module HaskellWorks.Data.Json.Succinct.PartialIndex where--import Control.Arrow-import HaskellWorks.Data.Bits.BitWise-import HaskellWorks.Data.Drop-import HaskellWorks.Data.Json.CharLike-import HaskellWorks.Data.Json.Cursor-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 qualified Data.ByteString                  as BS-import qualified Data.List                        as L-import qualified HaskellWorks.Data.BalancedParens as BP--data JsonPartialIndex-  = JsonPartialIndexString BS.ByteString-  | JsonPartialIndexNumber BS.ByteString-  | JsonPartialIndexObject [(BS.ByteString, JsonPartialIndex)]-  | JsonPartialIndexArray [JsonPartialIndex]-  | JsonPartialIndexBool Bool-  | JsonPartialIndexNull-  | JsonPartialIndexError String-  deriving (Eq, Show)--class JsonPartialIndexAt a where-  jsonPartialIndexAt :: a -> JsonPartialIndex--instance (BP.BalancedParens w, Rank0 w, Rank1 w, Select1 v, TestBit w) => JsonPartialIndexAt (JsonCursor BS.ByteString v w) where-  jsonPartialIndexAt k = case uncons remainder of-    Just (!c, _) | isLeadingDigit2 c  -> JsonPartialIndexNumber  remainder-    Just (!c, _) | isQuotDbl c        -> JsonPartialIndexString  remainder-    Just (!c, _) | isChar_t c         -> JsonPartialIndexBool    True-    Just (!c, _) | isChar_f c         -> JsonPartialIndexBool    False-    Just (!c, _) | isChar_n c         -> JsonPartialIndexNull-    Just (!c, _) | isBraceLeft c      -> JsonPartialIndexObject (mapValuesFrom   (firstChild k))-    Just (!c, _) | isBracketLeft c    -> JsonPartialIndexArray  (arrayValuesFrom (firstChild k))-    Just _       -> JsonPartialIndexError "Invalid Json Type"-    Nothing      -> JsonPartialIndexError "End of data"-    where ik                = interests k-          bpk               = balancedParens k-          p                 = lastPositionOf (select1 ik (rank1 bpk (cursorRank k)))-          remainder         = drop (toCount p) (cursorText k)-          arrayValuesFrom :: Maybe (JsonCursor BS.ByteString v w) -> [JsonPartialIndex]-          arrayValuesFrom = L.unfoldr (fmap (jsonPartialIndexAt &&& nextSibling))-          mapValuesFrom j   = pairwise (arrayValuesFrom j) >>= asField-          pairwise (a:b:rs) = (a, b) : pairwise rs-          pairwise _        = []-          asField (a, b)    = case a of-                                JsonPartialIndexString s -> [(s, b)]-                                _                        -> []
− src/HaskellWorks/Data/Json/Token.hs
@@ -1,6 +0,0 @@-module HaskellWorks.Data.Json.Token-  ( module X-  ) where--import HaskellWorks.Data.Json.Token.Types     as X-import HaskellWorks.Data.Json.Token.Tokenize  as X
− src/HaskellWorks/Data/Json/Token/Tokenize.hs
@@ -1,165 +0,0 @@-{-# LANGUAGE FlexibleContexts      #-}-{-# LANGUAGE FlexibleInstances     #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE OverloadedStrings     #-}-{-# LANGUAGE TypeSynonymInstances  #-}--module HaskellWorks.Data.Json.Token.Tokenize-    ( IsChar(..)-    , JsonToken(..)-    , ParseJson(..)-    ) where--import Control.Applicative-import Data.Bits-import Data.Char-import Data.Word-import Data.Word8-import HaskellWorks.Data.Char.IsChar-import HaskellWorks.Data.Json.Token.Types-import HaskellWorks.Data.Parser           as P--import qualified Data.Attoparsec.ByteString.Char8 as BC-import qualified Data.Attoparsec.Combinator       as AC-import qualified Data.Attoparsec.Types            as T-import qualified Data.ByteString                  as BS--hexDigitNumeric :: P.Parser t u => T.Parser t Int-hexDigitNumeric = do-  c <- satisfyChar (\c -> '0' <= c && c <= '9')-  return $ ord c - ord '0'--hexDigitAlphaLower :: P.Parser t u => T.Parser t Int-hexDigitAlphaLower = do-  c <- satisfyChar (\c -> 'a' <= c && c <= 'z')-  return $ ord c - ord 'a' + 10--hexDigitAlphaUpper :: P.Parser t u => T.Parser t Int-hexDigitAlphaUpper = do-  c <- satisfyChar (\c -> 'A' <= c && c <= 'Z')-  return $ ord c - ord 'A' + 10--hexDigit :: P.Parser t u => T.Parser t Int-hexDigit = hexDigitNumeric <|> hexDigitAlphaLower <|> hexDigitAlphaUpper--class ParseJson t s d where-  parseJsonTokenString :: T.Parser t (JsonToken s d)-  parseJsonToken :: T.Parser t (JsonToken s d)-  parseJsonTokenBraceL :: T.Parser t (JsonToken s d)-  parseJsonTokenBraceR :: T.Parser t (JsonToken s d)-  parseJsonTokenBracketL :: T.Parser t (JsonToken s d)-  parseJsonTokenBracketR :: T.Parser t (JsonToken s d)-  parseJsonTokenComma :: T.Parser t (JsonToken s d)-  parseJsonTokenColon :: T.Parser t (JsonToken s d)-  parseJsonTokenWhitespace :: T.Parser t (JsonToken s d)-  parseJsonTokenNull :: T.Parser t (JsonToken s d)-  parseJsonTokenBoolean :: T.Parser t (JsonToken s d)-  parseJsonTokenDouble :: T.Parser t (JsonToken s d)--  parseJsonToken =-    parseJsonTokenString     <|>-    parseJsonTokenBraceL     <|>-    parseJsonTokenBraceR     <|>-    parseJsonTokenBracketL   <|>-    parseJsonTokenBracketR   <|>-    parseJsonTokenComma      <|>-    parseJsonTokenColon      <|>-    parseJsonTokenWhitespace <|>-    parseJsonTokenNull       <|>-    parseJsonTokenBoolean    <|>-    parseJsonTokenDouble--instance ParseJson BS.ByteString String Double where-  parseJsonTokenBraceL = string "{" >> return JsonTokenBraceL-  parseJsonTokenBraceR = string "}" >> return JsonTokenBraceR-  parseJsonTokenBracketL = string "[" >> return JsonTokenBracketL-  parseJsonTokenBracketR = string "]" >> return JsonTokenBracketR-  parseJsonTokenComma = string "," >> return JsonTokenComma-  parseJsonTokenColon = string ":" >> return JsonTokenColon-  parseJsonTokenNull = string "null" >> return JsonTokenNull-  parseJsonTokenDouble = JsonTokenNumber <$> rational--  parseJsonTokenString = do-    _ <- string "\""-    value <- many (verbatimChar <|> escapedChar <|> escapedCode)-    _ <- string "\""-    return $ JsonTokenString value-    where-      verbatimChar  = satisfyChar (BC.notInClass "\"\\") <?> "invalid string character"-      escapedChar   = do-        _ <- string "\\"-        (   char '"'  >> return '"'  ) <|>-          ( char 'b'  >> return '\b' ) <|>-          ( char 'n'  >> return '\n' ) <|>-          ( char 'f'  >> return '\f' ) <|>-          ( char 'r'  >> return '\r' ) <|>-          ( char 't'  >> return '\t' ) <|>-          ( char '\\' >> return '\\' ) <|>-          ( char '\'' >> return '\'' ) <|>-          ( char '/'  >> return '/'  )-      escapedCode   = do-        _ <- string "\\u"-        a <- hexDigit-        b <- hexDigit-        c <- hexDigit-        d <- hexDigit-        return $ chr $ a `shift` 24 .|. b `shift` 16 .|. c `shift` 8 .|. d--  parseJsonTokenWhitespace = do-    _ <- AC.many1' $ BC.choice [string " ", string "\t", string "\n", string "\r"]-    return JsonTokenWhitespace--  parseJsonTokenBoolean = true <|> false-    where-      true  = string "true"   >> return (JsonTokenBoolean True)-      false = string "false"  >> return (JsonTokenBoolean False)--instance ParseJson BS.ByteString BS.ByteString Double where-  parseJsonTokenBraceL = string "{" >> return JsonTokenBraceL-  parseJsonTokenBraceR = string "}" >> return JsonTokenBraceR-  parseJsonTokenBracketL = string "[" >> return JsonTokenBracketL-  parseJsonTokenBracketR = string "]" >> return JsonTokenBracketR-  parseJsonTokenComma = string "," >> return JsonTokenComma-  parseJsonTokenColon = string ":" >> return JsonTokenColon-  parseJsonTokenNull = string "null" >> return JsonTokenNull-  parseJsonTokenDouble = JsonTokenNumber <$> rational--  parseJsonTokenString = do-    _ <- string "\""-    value <- many (verbatimChar <|> escapedChar <|> escapedCode)-    _ <- string "\""-    return $ JsonTokenString $ BS.pack value-    where-      word :: Word8 -> T.Parser BS.ByteString Word8-      word w = satisfy (== w)-      verbatimChar :: T.Parser BS.ByteString Word8-      verbatimChar  = satisfy (\w -> w /= _quotedbl && w /= _backslash) -- <?> "invalid string character"-      escapedChar :: T.Parser BS.ByteString Word8-      escapedChar   = do-        _ <- string "\\"-        (   word _quotedbl    >> return _quotedbl       ) <|>-          ( word _b           >> return 0x08            ) <|>-          ( word _n           >> return _lf             ) <|>-          ( word _f           >> return _np             ) <|>-          ( word _r           >> return _cr             ) <|>-          ( word _t           >> return _tab            ) <|>-          ( word _backslash   >> return _backslash      ) <|>-          ( word _quotesingle >> return _quotesingle    ) <|>-          ( word _slash       >> return _slash          )-      escapedCode :: T.Parser BS.ByteString Word8-      escapedCode   = do-        _ <- string "\\u"-        a <- hexDigit-        b <- hexDigit-        c <- hexDigit-        d <- hexDigit-        return $ fromIntegral $ a `shift` 24 .|. b `shift` 16 .|. c `shift` 8 .|. d--  parseJsonTokenWhitespace = do-    _ <- AC.many1' $ BC.choice [string " ", string "\t", string "\n", string "\r"]-    return JsonTokenWhitespace--  parseJsonTokenBoolean = true <|> false-    where-      true  = string "true"   >> return (JsonTokenBoolean True)-      false = string "false"  >> return (JsonTokenBoolean False)
− src/HaskellWorks/Data/Json/Token/Types.hs
@@ -1,15 +0,0 @@-module HaskellWorks.Data.Json.Token.Types (JsonToken(..)) where--data JsonToken s d-  = JsonTokenBraceL-  | JsonTokenBraceR-  | JsonTokenBracketL-  | JsonTokenBracketR-  | JsonTokenComma-  | JsonTokenColon-  | JsonTokenWhitespace-  | JsonTokenString s-  | JsonTokenBoolean Bool-  | JsonTokenNumber d-  | JsonTokenNull-  deriving (Eq, Show)
src/HaskellWorks/Data/Json/Type.hs view
@@ -12,6 +12,7 @@ import HaskellWorks.Data.Bits.BitWise import HaskellWorks.Data.Drop import HaskellWorks.Data.Json.Cursor+import HaskellWorks.Data.Json.Internal.Words import HaskellWorks.Data.Positioning import HaskellWorks.Data.RankSelect.Base.Rank0 import HaskellWorks.Data.RankSelect.Base.Rank1@@ -22,9 +23,6 @@ import qualified HaskellWorks.Data.BalancedParens as BP  {-# ANN module ("HLint: Reduce duplication" :: String) #-}--wIsJsonNumberDigit :: Word8 -> Bool-wIsJsonNumberDigit w = (w >= _0 && w <= _9) || w == _hyphen  data JsonType   = JsonTypeArray
src/HaskellWorks/Data/Json/Value.hs view
@@ -7,8 +7,8 @@ module HaskellWorks.Data.Json.Value where  import HaskellWorks.Data.Json.DecodeError-import HaskellWorks.Data.Json.Succinct.Index-import HaskellWorks.Data.Json.Value.Internal+import HaskellWorks.Data.Json.Internal.Index+import HaskellWorks.Data.Json.Internal.Value  import qualified Data.Attoparsec.ByteString.Char8 as ABC import qualified Data.ByteString                  as BS
− src/HaskellWorks/Data/Json/Value/Internal.hs
@@ -1,63 +0,0 @@-{-# LANGUAGE FlexibleContexts      #-}-{-# LANGUAGE FlexibleInstances     #-}-{-# LANGUAGE InstanceSigs          #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE OverloadedStrings     #-}-{-# LANGUAGE ScopedTypeVariables   #-}-{-# LANGUAGE TupleSections         #-}--module HaskellWorks.Data.Json.Value.Internal where--import Control.Applicative-import Data.Bits-import Data.Char-import Data.String-import HaskellWorks.Data.Parser as P--import qualified Data.Attoparsec.ByteString.Char8 as ABC-import qualified Data.Attoparsec.Types            as T--parseHexDigitNumeric :: P.Parser t u => T.Parser t Int-parseHexDigitNumeric = do-  c <- satisfyChar (\c -> '0' <= c && c <= '9')-  return $ ord c - ord '0'--parseHexDigitAlphaLower :: P.Parser t u => T.Parser t Int-parseHexDigitAlphaLower = do-  c <- satisfyChar (\c -> 'a' <= c && c <= 'z')-  return $ ord c - ord 'a' + 10--parseHexDigitAlphaUpper :: P.Parser t u => T.Parser t Int-parseHexDigitAlphaUpper = do-  c <- satisfyChar (\c -> 'A' <= c && c <= 'Z')-  return $ ord c - ord 'A' + 10--parseHexDigit :: P.Parser t u => T.Parser t Int-parseHexDigit = parseHexDigitNumeric <|> parseHexDigitAlphaLower <|> parseHexDigitAlphaUpper--parseJsonString :: (P.Parser t u, IsString t) => T.Parser t String-parseJsonString = do-  _ <- string "\""-  value <- many (verbatimChar <|> escapedChar <|> escapedCode)-  _ <- string "\""-  return value-  where-    verbatimChar  = satisfyChar (ABC.notInClass "\"\\") <?> "invalid string character"-    escapedChar   = do-      _ <- string "\\"-      (   char '"'  >> return '"'  ) <|>-        ( char 'b'  >> return '\b' ) <|>-        ( char 'n'  >> return '\n' ) <|>-        ( char 'f'  >> return '\f' ) <|>-        ( char 'r'  >> return '\r' ) <|>-        ( char 't'  >> return '\t' ) <|>-        ( char '\\' >> return '\\' ) <|>-        ( char '\'' >> return '\'' ) <|>-        ( char '/'  >> return '/'  )-    escapedCode   = do-      _ <- string "\\u"-      a <- parseHexDigit-      b <- parseHexDigit-      c <- parseHexDigit-      d <- parseHexDigit-      return $ chr $ a `shift` 24 .|. b `shift` 16 .|. c `shift` 8 .|. d
test/HaskellWorks/Data/Json/CorpusSpec.hs view
@@ -14,7 +14,6 @@  import Data.Word import HaskellWorks.Data.BalancedParens.Simple-import HaskellWorks.Data.Bits.BitShown import HaskellWorks.Data.Bits.FromBitTextByteString import HaskellWorks.Data.FromByteString import HaskellWorks.Data.Json.Cursor@@ -35,12 +34,12 @@     inInterestBalancedParensBS  <- BS.readFile "corpus/5000B.bp"     let inInterestBits            = fromBitTextByteString inInterestBitsBS     let inInterestBalancedParens  = fromBitTextByteString inInterestBalancedParensBS-    let !cursor = fromByteString inJsonBS :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64))+    let !cursor = fromByteString inJsonBS :: JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64))     let text                    = cursorText      cursor     let ib                      = interests       cursor     let SimpleBalancedParens bp = balancedParens  cursor     text `shouldBe` inJsonBS-    ib `shouldBe` BitShown inInterestBits+    ib `shouldBe` inInterestBits     bp `shouldBe` inInterestBalancedParens   it "issue-0001 loads properly" $ do     inJsonBS                    <- BS.readFile "corpus/issue-0001.json"@@ -48,10 +47,10 @@     inInterestBalancedParensBS  <- BS.readFile "corpus/issue-0001.bp"     let inInterestBits            = fromBitTextByteString inInterestBitsBS     let inInterestBalancedParens  = fromBitTextByteString inInterestBalancedParensBS-    let !cursor = fromByteString inJsonBS :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64))+    let !cursor = fromByteString inJsonBS :: JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64))     let text                    = cursorText      cursor     let ib                      = interests       cursor     let SimpleBalancedParens bp = balancedParens  cursor     text `shouldBe` inJsonBS-    ib `shouldBe` BitShown inInterestBits+    ib `shouldBe` inInterestBits     bp `shouldBe` inInterestBalancedParens
test/HaskellWorks/Data/Json/Succinct/Cursor/BalancedParensSpec.hs view
@@ -6,20 +6,20 @@ import Data.String import HaskellWorks.Data.Bits.BitShown import HaskellWorks.Data.Json.Internal.MakeIndex-import HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson import Test.Hspec -import qualified Data.ByteString as BS+import qualified Data.ByteString                             as BS+import qualified HaskellWorks.Data.Json.Internal.BlankedJson as J  {-# ANN module ("HLint: Ignore Redundant do"        :: String) #-}  spec :: Spec spec = describe "HaskellWorks.Data.Json.Succinct.Cursor.BalancedParensSpec" $ do   it "Blanking JSON should not contain strange characters 1" $ do-    let blankedJson = BlankedJson ["[ [],", "[]]"]-    let bp = BitShown $ BS.concat (blankedJsonToBalancedParens2 (getBlankedJson blankedJson))+    let blankedJson = J.BlankedJson ["[ [],", "[]]"]+    let bp = BitShown $ BS.concat (blankedJsonToBalancedParens (J.unBlankedJson blankedJson))     bp `shouldBe` fromString "11111111 11111111 00000000 11111111 00000000 00000000"   it "Blanking JSON should not contain strange characters 2" $ do-    let blankedJson = BlankedJson ["[ [],", "[]]"]-    let bp = BitShown $ BS.concat ((compressWordAsBit . blankedJsonToBalancedParens2) (getBlankedJson blankedJson))+    let blankedJson = J.BlankedJson ["[ [],", "[]]"]+    let bp = BitShown $ BS.concat ((compressWordAsBit . blankedJsonToBalancedParens) (J.unBlankedJson blankedJson))     bp `shouldBe` fromString "11010000"
test/HaskellWorks/Data/Json/Succinct/Cursor/InterestBitsSpec.hs view
@@ -7,34 +7,33 @@ import Data.String import Data.Word import HaskellWorks.Data.Bits.BitShown-import HaskellWorks.Data.FromByteString-import HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson-import HaskellWorks.Data.Json.Succinct.Cursor.InterestBits import Test.Hspec -import qualified Data.ByteString      as BS-import qualified Data.Vector.Storable as DVS+import qualified Data.ByteString                                  as BS+import qualified Data.Vector.Storable                             as DVS+import qualified HaskellWorks.Data.Json.Internal.BlankedJson      as J+import qualified HaskellWorks.Data.Json.Internal.ToInterestBits64 as J  {-# ANN module ("HLint: ignore Redundant do"        :: String) #-} -interestBitsOf :: FromBlankedJson (JsonInterestBits a) => BS.ByteString -> a-interestBitsOf = getJsonInterestBits . fromBlankedJson . fromByteString+interestBitsOf :: BS.ByteString -> DVS.Vector Word64+interestBitsOf bs = J.toInterestBits64 (J.toBlankedJsonTyped bs)  spec :: Spec spec = describe "HaskellWorks.Data.Json.Succinct.Cursor.InterestBitsSpec" $ do   it "Evaluating interest bits" $ do-    (interestBitsOf ""            :: BitShown (DVS.Vector Word8)) `shouldBe` fromString ""-    (interestBitsOf "  \n \r \t " :: BitShown (DVS.Vector Word8)) `shouldBe` fromString "00000000"-    (interestBitsOf "1234 "       :: BitShown (DVS.Vector Word8)) `shouldBe` fromString "10000000"-    (interestBitsOf "false "      :: BitShown (DVS.Vector Word8)) `shouldBe` fromString "10000000"-    (interestBitsOf "true "       :: BitShown (DVS.Vector Word8)) `shouldBe` fromString "10000000"-    (interestBitsOf "\"hello\" "  :: BitShown (DVS.Vector Word8)) `shouldBe` fromString "10000000"-    (interestBitsOf "\"\\\"\" "   :: BitShown (DVS.Vector Word8)) `shouldBe` fromString "10000000"-    (interestBitsOf "{ "          :: BitShown (DVS.Vector Word8)) `shouldBe` fromString "10000000"-    (interestBitsOf "} "          :: BitShown (DVS.Vector Word8)) `shouldBe` fromString "00000000"-    (interestBitsOf "[ "          :: BitShown (DVS.Vector Word8)) `shouldBe` fromString "10000000"-    (interestBitsOf "] "          :: BitShown (DVS.Vector Word8)) `shouldBe` fromString "00000000"-    (interestBitsOf ": "          :: BitShown (DVS.Vector Word8)) `shouldBe` fromString "00000000"-    (interestBitsOf ", "          :: BitShown (DVS.Vector Word8)) `shouldBe` fromString "00000000"-    (interestBitsOf "{{}}"        :: BitShown (DVS.Vector Word8)) `shouldBe` fromString "11000000"-    (interestBitsOf " { { } } "   :: BitShown (DVS.Vector Word8)) `shouldBe` fromString "01010000 00000000"+    BitShown (interestBitsOf ""           ) `shouldBe` fromString ""+    BitShown (interestBitsOf "  \n \r \t ") `shouldBe` fromString "00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"+    BitShown (interestBitsOf "1234 "      ) `shouldBe` fromString "10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"+    BitShown (interestBitsOf "false "     ) `shouldBe` fromString "10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"+    BitShown (interestBitsOf "true "      ) `shouldBe` fromString "10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"+    BitShown (interestBitsOf "\"hello\" " ) `shouldBe` fromString "10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"+    BitShown (interestBitsOf "\"\\\"\" "  ) `shouldBe` fromString "10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"+    BitShown (interestBitsOf "{ "         ) `shouldBe` fromString "10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"+    BitShown (interestBitsOf "} "         ) `shouldBe` fromString "00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"+    BitShown (interestBitsOf "[ "         ) `shouldBe` fromString "10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"+    BitShown (interestBitsOf "] "         ) `shouldBe` fromString "00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"+    BitShown (interestBitsOf ": "         ) `shouldBe` fromString "00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"+    BitShown (interestBitsOf ", "         ) `shouldBe` fromString "00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"+    BitShown (interestBitsOf "{{}}"       ) `shouldBe` fromString "11000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"+    BitShown (interestBitsOf " { { } } "  ) `shouldBe` fromString "01010000 00000000 00000000 00000000 00000000 00000000 00000000 00000000"
test/HaskellWorks/Data/Json/Succinct/CursorSpec.hs view
@@ -16,14 +16,12 @@ import Data.Word import HaskellWorks.Data.BalancedParens.BalancedParens import HaskellWorks.Data.BalancedParens.Simple-import HaskellWorks.Data.Bits.BitShow-import HaskellWorks.Data.Bits.BitShown import HaskellWorks.Data.Bits.BitWise import HaskellWorks.Data.FromForeignRegion import HaskellWorks.Data.Json.Cursor-import HaskellWorks.Data.Json.Succinct.Cursor.Token-import HaskellWorks.Data.Json.Succinct.Index-import HaskellWorks.Data.Json.Token+import HaskellWorks.Data.Json.Internal.Cursor.Token+import HaskellWorks.Data.Json.Internal.Index+import HaskellWorks.Data.Json.Internal.Token import HaskellWorks.Data.RankSelect.Base.Rank0 import HaskellWorks.Data.RankSelect.Base.Rank1 import HaskellWorks.Data.RankSelect.Base.Select1@@ -41,51 +39,13 @@ fc = TC.firstChild ns = TC.nextSibling pn = TC.parent--- cd = TC.depth ss = TC.subtreeSize  spec :: Spec spec = describe "HaskellWorks.Data.Json.Succinct.CursorSpec" $ do-  -- describe "Cursor for [Bool]" $ do-  --   it "depth at top" $ do-  --     let cursor = "[null]" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-  --     cd cursor `shouldBe` Just 1-  --   it "depth at first child of array" $ do-  --     let cursor = "[null]" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-  --     (fc >=> cd) cursor `shouldBe` Just 2-  --   it "depth at second child of array" $ do-  --     let cursor = "[null, {\"field\": 1}]" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-  --     (fc >=> ns >=> cd) cursor `shouldBe` Just 2-  --   it "depth at first child of object at second child of array" $ do-  --     let cursor = "[null, {\"field\": 1}]" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-  --     (fc >=> ns >=> fc >=> cd) cursor `shouldBe` Just 3-  --   it "depth at first child of object at second child of array" $ do-  --     let cursor = "[null, {\"field\": 1}]" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-  --     (fc >=> ns >=> fc >=> ns >=> cd) cursor `shouldBe` Just 3-  genSpec "DVS.Vector Word8"  (undefined :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word8)) (SimpleBalancedParens (DVS.Vector Word8)))-  genSpec "DVS.Vector Word16" (undefined :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word16)) (SimpleBalancedParens (DVS.Vector Word16)))-  genSpec "DVS.Vector Word32" (undefined :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word32)) (SimpleBalancedParens (DVS.Vector Word32)))-  genSpec "DVS.Vector Word64" (undefined :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64)))+  genSpec "DVS.Vector Word64" (undefined :: JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64)))   genSpec "Poppy512"          (undefined :: JsonCursor BS.ByteString Poppy512 (SimpleBalancedParens (DVS.Vector Word64)))-  it "Loads same Json consistentally from different backing vectors" $ do-    let cursor8   = "{\n    \"widget\": {\n        \"debug\": \"on\"  } }" :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word8)) (SimpleBalancedParens (DVS.Vector Word8))-    let cursor16  = "{\n    \"widget\": {\n        \"debug\": \"on\"  } }" :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word16)) (SimpleBalancedParens (DVS.Vector Word16))-    let cursor32  = "{\n    \"widget\": {\n        \"debug\": \"on\"  } }" :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word32)) (SimpleBalancedParens (DVS.Vector Word32))-    let cursor64  = "{\n    \"widget\": {\n        \"debug\": \"on\"  } }" :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64))-    cursorText cursor8 `shouldBe` cursorText cursor16-    cursorText cursor8 `shouldBe` cursorText cursor32-    cursorText cursor8 `shouldBe` cursorText cursor64-    let ic8   = bitShow $ interests cursor8-    let ic16  = bitShow $ interests cursor16-    let ic32  = bitShow $ interests cursor32-    let ic64  = bitShow $ interests cursor64-    ic16 `shouldBeginWith` ic8-    ic32 `shouldBeginWith` ic16-    ic64 `shouldBeginWith` ic32 -shouldBeginWith :: (Eq a, Show a) => [a] -> [a] -> IO ()-shouldBeginWith as bs = take (length bs) as `shouldBe` bs- genSpec :: forall t u.   ( Eq                t   , Show              t@@ -101,17 +61,6 @@   => String -> (JsonCursor BS.ByteString t u) -> SpecWith () genSpec t _ = do   describe ("Json cursor of type " ++ t) $ do-    -- let forJson (cursor :: JsonCursor BS.ByteString t u) f = describe ("of value " ++ show cursor) (f cursor)-    -- forJson "[null]" $ \cursor -> do-    --   it "depth at top"                   $ cd          cursor `shouldBe` Just 1-    --   it "depth at first child of array"  $ (fc >=> cd) cursor `shouldBe` Just 2-    -- forJson "[null, {\"field\": 1}]" $ \cursor -> do-    --   it "depth at second child of array" $ do-    --     (fc >=> ns >=> cd) cursor `shouldBe` Just 2-    --   it "depth at first child of object at second child of array" $ do-    --     (fc >=> ns >=> fc >=> cd) cursor `shouldBe` Just 3-    --   it "depth at first child of object at second child of array" $ do-    --     (fc >=> ns >=> fc >=> ns >=> cd) cursor `shouldBe` Just 3     describe "For empty json array" $ do       let cursor =  "[null]" :: JsonCursor BS.ByteString t u       it "can navigate down and forwards" $ do
test/HaskellWorks/Data/Json/Token/TokenizeSpec.hs view
@@ -2,8 +2,8 @@  module HaskellWorks.Data.Json.Token.TokenizeSpec (spec) where -import Data.ByteString                       as BS-import HaskellWorks.Data.Json.Token.Tokenize+import Data.ByteString                                (ByteString)+import HaskellWorks.Data.Json.Internal.Token.Tokenize import Test.Hspec  import qualified Data.Attoparsec.ByteString.Char8 as BC
test/HaskellWorks/Data/Json/TypeSpec.hs view
@@ -16,7 +16,6 @@ import Data.Word import HaskellWorks.Data.BalancedParens.BalancedParens import HaskellWorks.Data.BalancedParens.Simple-import HaskellWorks.Data.Bits.BitShown import HaskellWorks.Data.Bits.BitWise import HaskellWorks.Data.FromForeignRegion import HaskellWorks.Data.Json.Cursor@@ -40,47 +39,7 @@  spec :: Spec spec = describe "HaskellWorks.Data.Json.Succinct.CursorSpec" $ do-  describe "Cursor for [Bool]" $ do-    it "initialises to beginning of empty object" $ do-      let cursor = "{}" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-      jsonTypeAt cursor `shouldBe` Just JsonTypeObject-    it "initialises to beginning of empty object preceded by spaces" $ do-      let cursor = " {}" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-      jsonTypeAt cursor `shouldBe` Just JsonTypeObject-    it "initialises to beginning of number" $ do-      let cursor = "1234" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-      jsonTypeAt cursor `shouldBe` Just JsonTypeNumber-    it "initialises to beginning of string" $ do-      let cursor = "\"Hello\"" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-      jsonTypeAt cursor `shouldBe` Just JsonTypeString-    it "initialises to beginning of array" $ do-      let cursor = "[]" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-      jsonTypeAt cursor `shouldBe` Just JsonTypeArray-    it "initialises to beginning of boolean true" $ do-      let cursor = "true" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-      jsonTypeAt cursor `shouldBe` Just JsonTypeBool-    it "initialises to beginning of boolean false" $ do-      let cursor = "false" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-      jsonTypeAt cursor `shouldBe` Just JsonTypeBool-    it "initialises to beginning of null" $ do-      let cursor = "null" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-      jsonTypeAt cursor `shouldBe` Just JsonTypeNull-    it "cursor can navigate to first child of array" $ do-      let cursor = "[null]" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-      (fc >=> jsonTypeAt) cursor `shouldBe` Just JsonTypeNull-    it "cursor can navigate to second child of array" $ do-      let cursor = "[null, {\"field\": 1}]" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-      (fc >=> ns >=> jsonTypeAt) cursor `shouldBe` Just JsonTypeObject-    it "cursor can navigate to first child of object at second child of array" $ do-      let cursor = "[null, {\"field\": 1}]" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-      (fc >=> ns >=> fc >=> jsonTypeAt) cursor `shouldBe` Just JsonTypeString-    it "cursor can navigate to first child of object at second child of array" $ do-      let cursor = "[null, {\"field\": 1}]" :: JsonCursor String (BitShown [Bool]) (SimpleBalancedParens [Bool])-      (fc >=> ns >=> fc >=> ns >=> jsonTypeAt) cursor `shouldBe` Just JsonTypeNumber-  genSpec "DVS.Vector Word8"  (undefined :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word8)) (SimpleBalancedParens (DVS.Vector Word8)))-  genSpec "DVS.Vector Word16" (undefined :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word16)) (SimpleBalancedParens (DVS.Vector Word16)))-  genSpec "DVS.Vector Word32" (undefined :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word32)) (SimpleBalancedParens (DVS.Vector Word32)))-  genSpec "DVS.Vector Word64" (undefined :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64)))+  genSpec "DVS.Vector Word64" (undefined :: JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64)))   genSpec "Poppy512"          (undefined :: JsonCursor BS.ByteString Poppy512 (SimpleBalancedParens (DVS.Vector Word64)))  genSpec :: forall t u.
test/HaskellWorks/Data/Json/ValueSpec.hs view
@@ -16,12 +16,11 @@ import Data.Word import HaskellWorks.Data.BalancedParens.BalancedParens import HaskellWorks.Data.BalancedParens.Simple-import HaskellWorks.Data.Bits.BitShown import HaskellWorks.Data.Bits.BitWise import HaskellWorks.Data.FromForeignRegion import HaskellWorks.Data.Json.Cursor import HaskellWorks.Data.Json.DecodeError-import HaskellWorks.Data.Json.Succinct.Index+import HaskellWorks.Data.Json.Internal.Index import HaskellWorks.Data.Json.Value import HaskellWorks.Data.RankSelect.Base.Rank0 import HaskellWorks.Data.RankSelect.Base.Rank1@@ -39,14 +38,10 @@  fc = TC.firstChild ns = TC.nextSibling--- cd = TC.depth  spec :: Spec spec = describe "HaskellWorks.Data.Json.ValueSpec" $ do-  genSpec "DVS.Vector Word8"  (undefined :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word8)) (SimpleBalancedParens (DVS.Vector Word8)))-  genSpec "DVS.Vector Word16" (undefined :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word16)) (SimpleBalancedParens (DVS.Vector Word16)))-  genSpec "DVS.Vector Word32" (undefined :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word32)) (SimpleBalancedParens (DVS.Vector Word32)))-  genSpec "DVS.Vector Word64" (undefined :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64)))+  genSpec "DVS.Vector Word64" (undefined :: JsonCursor BS.ByteString (DVS.Vector Word64) (SimpleBalancedParens (DVS.Vector Word64)))   genSpec "Poppy512"          (undefined :: JsonCursor BS.ByteString Poppy512 (SimpleBalancedParens (DVS.Vector Word64)))  jsonValueVia  ::@@ -95,18 +90,10 @@     forJson "[null]" $ \cursor -> do       it "should have correct value"      $ jsonValueVia (Just cursor) `shouldBe` Right (JsonArray [JsonNull])       it "should have correct value"      $ jsonValueVia (fc   cursor) `shouldBe` Right  JsonNull-      -- it "depth at top"                   $ cd          cursor `shouldBe` Just 1-      -- it "depth at first child of array"  $ (fc >=> cd) cursor `shouldBe` Just 2     forJson "[null, {\"field\": 1}]" $ \cursor -> do       it "cursor can navigate to second child of array" $ do         jsonValueVia ((fc >=> ns)   cursor) `shouldBe` Right (                     JsonObject [("field", JsonNumber 1)] )         jsonValueVia (Just          cursor) `shouldBe` Right (JsonArray [JsonNull, JsonObject [("field", JsonNumber 1)]])-      -- it "depth at second child of array" $ do-      --   (fc >=> ns >=> cd) cursor `shouldBe` Just 2-      -- it "depth at first child of object at second child of array" $ do-      --   (fc >=> ns >=> fc >=> cd) cursor `shouldBe` Just 3-      -- it "depth at first child of object at second child of array" $ do-      --   (fc >=> ns >=> fc >=> ns >=> cd) cursor `shouldBe` Just 3     describe "For empty json array" $ do       let cursor =  "[]" :: JsonCursor BS.ByteString t u       it "can navigate down and forwards" $ do