packages feed

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