hw-succinct 0.0.0.9 → 0.0.0.10
raw patch · 4 files changed
+56/−20 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- HaskellWorks.Data.Json.Succinct.Cursor: jsonTokenAt :: (Rank1 w, Select1 v) => JsonCursor ByteString v w -> JsonToken
+ HaskellWorks.Data.Json.Succinct.Cursor: jsonTokenAt :: (Rank1 w, Select1 v, TestBit w) => JsonCursor ByteString v w -> Maybe JsonToken
Files
- README.md +31/−0
- hw-succinct.cabal +1/−1
- src/HaskellWorks/Data/Json/Succinct/Cursor.hs +8/−5
- test/HaskellWorks/Data/Json/Succinct/CursorSpec.hs +16/−14
README.md view
@@ -65,6 +65,8 @@ ## Examples +### Performance example+ import Foreign import qualified Data.Vector.Storable as DVS import qualified Data.ByteString as BS@@ -91,6 +93,35 @@ x <- measure $ jsonBsToInterestBs bs jsonTokenAt $ J.nextSibling $ J.firstChild $ J.nextSibling $ J.firstChild $ J.firstChild cursor++### Navigation example++ $ cabal repl --ghc-option='-package mmap'+ λ> :set -XNoMonomorphismRestriction+ λ> import qualified Data.ByteString as BS+ λ> import Data.String+ λ> import qualified Data.Vector.Storable as DVS+ λ> import Data.Word+ λ> import HaskellWorks.Data.Bits.BitShow+ λ> import HaskellWorks.Data.Bits.BitShown+ λ> import HaskellWorks.Data.FromForeignRegion+ λ> import HaskellWorks.Data.Json.Succinct.Cursor as C+ λ> import HaskellWorks.Data.Json.Token+ λ> import HaskellWorks.Data.Succinct.BalancedParens.Internal+ λ> import HaskellWorks.Data.Succinct.BalancedParens.Simple+ λ> import HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Rank0+ λ> import HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Rank1+ λ> import HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Select1+ λ> import HaskellWorks.Data.Succinct.RankSelect.Binary.Poppy512+ λ> import qualified HaskellWorks.Data.TreeCursor as TC+ λ> import System.IO.MMap+ λ> 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))+ λ> cursor ## References * [Succinct Data Structures talk by Edward Kmett](https://www.youtube.com/watch?v=uA0Z7_4J7u8)
hw-succinct.cabal view
@@ -1,5 +1,5 @@ name: hw-succinct-version: 0.0.0.9+version: 0.0.0.10 synopsis: Conduits for tokenizing streams. description: Please see README.md homepage: http://github.com/haskell-works/hw-succinct#readme
src/HaskellWorks/Data/Json/Succinct/Cursor.hs view
@@ -10,6 +10,7 @@ import qualified Data.Attoparsec.ByteString.Char8 as ABC import Data.ByteString.Internal as BSI+import HaskellWorks.Data.Bits.BitWise import HaskellWorks.Data.Json.Final.Tokenize.Internal import HaskellWorks.Data.Json.Succinct.Cursor.CursorType as X import HaskellWorks.Data.Json.Succinct.Cursor.Internal as X@@ -18,8 +19,10 @@ import HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Select1 import HaskellWorks.Data.Vector.VectorLike -jsonTokenAt :: (Rank1 w, Select1 v) => JsonCursor ByteString v w -> JsonToken-jsonTokenAt k = case ABC.parse parseJsonToken (vDrop (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 -> r+jsonTokenAt :: (Rank1 w, Select1 v, TestBit w) => JsonCursor ByteString v w -> Maybe JsonToken+jsonTokenAt k = if balancedParens k .?. lastPositionOf (cursorRank k)+ then case ABC.parse parseJsonToken (vDrop (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
test/HaskellWorks/Data/Json/Succinct/CursorSpec.hs view
@@ -17,6 +17,7 @@ import Data.Word import HaskellWorks.Data.Bits.BitShow import HaskellWorks.Data.Bits.BitShown+import HaskellWorks.Data.Bits.BitWise import HaskellWorks.Data.FromForeignRegion import HaskellWorks.Data.Json.Succinct.Cursor as C import HaskellWorks.Data.Json.Token@@ -126,7 +127,8 @@ , Show u , Rank0 u , Rank1 u- , BalancedParens u+ , BalancedParens u+ , TestBit u , FromForeignRegion (JsonCursor BS.ByteString t u) , IsString (JsonCursor BS.ByteString t u) , HasJsonCursorType (JsonCursor BS.ByteString t u))@@ -234,16 +236,16 @@ it "can get token at cursor" $ do (fptr, offset, size) <- mmapFileForeignPtr "test/data/sample.json" ReadOnly Nothing let cursor = fromForeignRegion (fptr, offset, size) :: JsonCursor BS.ByteString t u- jsonTokenAt cursor `shouldBe` JsonTokenBraceL- jsonTokenAt (( fc) cursor) `shouldBe` JsonTokenString "widget"- jsonTokenAt (( ns . fc) cursor) `shouldBe` JsonTokenBraceL- jsonTokenAt (( fc . ns . fc) cursor) `shouldBe` JsonTokenString "debug"- jsonTokenAt (( ns . fc . ns . fc) cursor) `shouldBe` JsonTokenString "on"- jsonTokenAt (( ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenString "window"- jsonTokenAt (( ns . ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenBraceL- jsonTokenAt (( fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenString "title"- jsonTokenAt (( ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenString "Sample Konfabulator Widget"- jsonTokenAt (( ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenString "name"- jsonTokenAt (( ns . ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenString "main_window"- jsonTokenAt (( ns . ns . ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenString "width"- jsonTokenAt ((ns . ns . ns . ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenNumber 500.0+ jsonTokenAt cursor `shouldBe` Just (JsonTokenBraceL )+ jsonTokenAt (( fc) cursor) `shouldBe` Just (JsonTokenString "widget" )+ jsonTokenAt (( ns . fc) cursor) `shouldBe` Just (JsonTokenBraceL )+ jsonTokenAt (( fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "debug" )+ jsonTokenAt (( ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "on" )+ jsonTokenAt (( ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "window" )+ jsonTokenAt (( ns . ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenBraceL )+ jsonTokenAt (( fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "title" )+ jsonTokenAt (( ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "Sample Konfabulator Widget")+ jsonTokenAt (( ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "name" )+ jsonTokenAt (( ns . ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "main_window" )+ jsonTokenAt (( ns . ns . ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "width" )+ jsonTokenAt ((ns . ns . ns . ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenNumber 500.0 )