packages feed

hw-succinct 0.0.0.10 → 0.0.0.11

raw patch · 11 files changed

+258/−242 lines, 11 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- HaskellWorks.Data.Json.Final.Tokenize: parseJsonToken :: (JsonTokenLike j, Parser t, IsString t) => Parser t j
- HaskellWorks.Data.Json.Final.Tokenize.Internal: (<?>) :: Parser t => Parser t Char -> String -> Parser t Char
- HaskellWorks.Data.Json.Final.Tokenize.Internal: JsonTokenBoolean :: Bool -> JsonToken
- HaskellWorks.Data.Json.Final.Tokenize.Internal: JsonTokenBraceL :: JsonToken
- HaskellWorks.Data.Json.Final.Tokenize.Internal: JsonTokenBraceR :: JsonToken
- HaskellWorks.Data.Json.Final.Tokenize.Internal: JsonTokenBracketL :: JsonToken
- HaskellWorks.Data.Json.Final.Tokenize.Internal: JsonTokenBracketR :: JsonToken
- HaskellWorks.Data.Json.Final.Tokenize.Internal: JsonTokenColon :: JsonToken
- HaskellWorks.Data.Json.Final.Tokenize.Internal: JsonTokenComma :: JsonToken
- HaskellWorks.Data.Json.Final.Tokenize.Internal: JsonTokenNull :: JsonToken
- HaskellWorks.Data.Json.Final.Tokenize.Internal: JsonTokenNumber :: Double -> JsonToken
- HaskellWorks.Data.Json.Final.Tokenize.Internal: JsonTokenString :: String -> JsonToken
- HaskellWorks.Data.Json.Final.Tokenize.Internal: JsonTokenWhitespace :: JsonToken
- HaskellWorks.Data.Json.Final.Tokenize.Internal: char :: Parser t => Char -> Parser t Char
- HaskellWorks.Data.Json.Final.Tokenize.Internal: class IsChar c
- HaskellWorks.Data.Json.Final.Tokenize.Internal: class MonoTraversable t => Parser t
- HaskellWorks.Data.Json.Final.Tokenize.Internal: data JsonToken
- HaskellWorks.Data.Json.Final.Tokenize.Internal: escapedChar :: (IsString t, Parser t) => Parser t Char
- HaskellWorks.Data.Json.Final.Tokenize.Internal: parseJsonToken :: (JsonTokenLike j, Parser t, IsString t) => Parser t j
- HaskellWorks.Data.Json.Final.Tokenize.Internal: parseJsonTokenString :: (JsonTokenLike j, Parser t, Alternative (Parser t), IsString t) => Parser t j
- HaskellWorks.Data.Json.Final.Tokenize.Internal: rational :: (Parser t, Fractional f) => Parser t f
- HaskellWorks.Data.Json.Final.Tokenize.Internal: satisfy :: Parser t => (Element t -> Bool) -> Parser t (Element t)
- HaskellWorks.Data.Json.Final.Tokenize.Internal: satisfyChar :: Parser t => (Char -> Bool) -> Parser t Char
- HaskellWorks.Data.Json.Final.Tokenize.Internal: satisfyWith :: Parser t => (Element t -> a) -> (a -> Bool) -> Parser t a
- HaskellWorks.Data.Json.Final.Tokenize.Internal: string :: Parser t => t -> Parser t t
- HaskellWorks.Data.Json.Final.Tokenize.Internal: toChar :: IsChar c => c -> Char
- HaskellWorks.Data.Json.Final.Tokenize.Internal: try :: Parser t => Parser t a -> Parser t a
- HaskellWorks.Data.Json.Succinct.Cursor: jsonTokenAt :: (Rank1 w, Select1 v, TestBit w) => JsonCursor ByteString v w -> Maybe JsonToken
- HaskellWorks.Data.Json.Token: JsonTokenBoolean :: Bool -> JsonToken
- HaskellWorks.Data.Json.Token: JsonTokenBraceL :: JsonToken
- HaskellWorks.Data.Json.Token: JsonTokenBraceR :: JsonToken
- HaskellWorks.Data.Json.Token: JsonTokenBracketL :: JsonToken
- HaskellWorks.Data.Json.Token: JsonTokenBracketR :: JsonToken
- HaskellWorks.Data.Json.Token: JsonTokenColon :: JsonToken
- HaskellWorks.Data.Json.Token: JsonTokenComma :: JsonToken
- HaskellWorks.Data.Json.Token: JsonTokenNull :: JsonToken
- HaskellWorks.Data.Json.Token: JsonTokenNumber :: Double -> JsonToken
- HaskellWorks.Data.Json.Token: JsonTokenString :: String -> JsonToken
- HaskellWorks.Data.Json.Token: JsonTokenWhitespace :: JsonToken
- HaskellWorks.Data.Json.Token: class JsonTokenLike j
- HaskellWorks.Data.Json.Token: data JsonToken
- HaskellWorks.Data.Json.Token: instance GHC.Classes.Eq HaskellWorks.Data.Json.Token.JsonToken
- HaskellWorks.Data.Json.Token: instance GHC.Show.Show HaskellWorks.Data.Json.Token.JsonToken
- HaskellWorks.Data.Json.Token: instance HaskellWorks.Data.Json.Token.JsonTokenLike HaskellWorks.Data.Json.Token.JsonToken
- HaskellWorks.Data.Json.Token: jsonTokenBoolean :: JsonTokenLike j => Bool -> j
- HaskellWorks.Data.Json.Token: jsonTokenBraceL :: JsonTokenLike j => j
- HaskellWorks.Data.Json.Token: jsonTokenBraceR :: JsonTokenLike j => j
- HaskellWorks.Data.Json.Token: jsonTokenBracketL :: JsonTokenLike j => j
- HaskellWorks.Data.Json.Token: jsonTokenBracketR :: JsonTokenLike j => j
- HaskellWorks.Data.Json.Token: jsonTokenColon :: JsonTokenLike j => j
- HaskellWorks.Data.Json.Token: jsonTokenComma :: JsonTokenLike j => j
- HaskellWorks.Data.Json.Token: jsonTokenNull :: JsonTokenLike j => j
- HaskellWorks.Data.Json.Token: jsonTokenNumber :: JsonTokenLike j => Double -> j
- HaskellWorks.Data.Json.Token: jsonTokenString :: JsonTokenLike j => String -> j
- HaskellWorks.Data.Json.Token: jsonTokenWhitespace :: JsonTokenLike j => j
+ HaskellWorks.Data.Json.Succinct.Cursor.Token: jsonTokenAt :: (Rank1 w, Select1 v, TestBit w) => JsonCursor ByteString v w -> Maybe JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: (<?>) :: Parser t => Parser t Char -> String -> Parser t Char
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBoolean :: Bool -> JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBraceL :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBraceR :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBracketL :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBracketR :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenColon :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenComma :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenNull :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenNumber :: Double -> JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenString :: String -> JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenWhitespace :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: char :: Parser t => Char -> Parser t Char
+ HaskellWorks.Data.Json.Token.Tokenize: class IsChar c
+ HaskellWorks.Data.Json.Token.Tokenize: class MonoTraversable t => Parser t
+ HaskellWorks.Data.Json.Token.Tokenize: data JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: escapedChar :: (IsString t, Parser t) => Parser t Char
+ HaskellWorks.Data.Json.Token.Tokenize: parseJsonToken :: (JsonTokenLike j, Parser t, IsString t) => Parser t j
+ HaskellWorks.Data.Json.Token.Tokenize: parseJsonTokenString :: (JsonTokenLike j, Parser t, Alternative (Parser t), IsString t) => Parser t j
+ HaskellWorks.Data.Json.Token.Tokenize: rational :: (Parser t, Fractional f) => Parser t f
+ HaskellWorks.Data.Json.Token.Tokenize: satisfy :: Parser t => (Element t -> Bool) -> Parser t (Element t)
+ HaskellWorks.Data.Json.Token.Tokenize: satisfyChar :: Parser t => (Char -> Bool) -> Parser t Char
+ HaskellWorks.Data.Json.Token.Tokenize: satisfyWith :: Parser t => (Element t -> a) -> (a -> Bool) -> Parser t a
+ HaskellWorks.Data.Json.Token.Tokenize: string :: Parser t => t -> Parser t t
+ HaskellWorks.Data.Json.Token.Tokenize: toChar :: IsChar c => c -> Char
+ HaskellWorks.Data.Json.Token.Tokenize: try :: Parser t => Parser t a -> Parser t a
+ HaskellWorks.Data.Json.Token.Types: JsonTokenBoolean :: Bool -> JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenBraceL :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenBraceR :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenBracketL :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenBracketR :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenColon :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenComma :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenNull :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenNumber :: Double -> JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenString :: String -> JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenWhitespace :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: class JsonTokenLike j
+ HaskellWorks.Data.Json.Token.Types: data JsonToken
+ HaskellWorks.Data.Json.Token.Types: instance GHC.Classes.Eq HaskellWorks.Data.Json.Token.Types.JsonToken
+ HaskellWorks.Data.Json.Token.Types: instance GHC.Show.Show HaskellWorks.Data.Json.Token.Types.JsonToken
+ HaskellWorks.Data.Json.Token.Types: instance HaskellWorks.Data.Json.Token.Types.JsonTokenLike HaskellWorks.Data.Json.Token.Types.JsonToken
+ HaskellWorks.Data.Json.Token.Types: jsonTokenBoolean :: JsonTokenLike j => Bool -> j
+ HaskellWorks.Data.Json.Token.Types: jsonTokenBraceL :: JsonTokenLike j => j
+ HaskellWorks.Data.Json.Token.Types: jsonTokenBraceR :: JsonTokenLike j => j
+ HaskellWorks.Data.Json.Token.Types: jsonTokenBracketL :: JsonTokenLike j => j
+ HaskellWorks.Data.Json.Token.Types: jsonTokenBracketR :: JsonTokenLike j => j
+ HaskellWorks.Data.Json.Token.Types: jsonTokenColon :: JsonTokenLike j => j
+ HaskellWorks.Data.Json.Token.Types: jsonTokenComma :: JsonTokenLike j => j
+ HaskellWorks.Data.Json.Token.Types: jsonTokenNull :: JsonTokenLike j => j
+ HaskellWorks.Data.Json.Token.Types: jsonTokenNumber :: JsonTokenLike j => Double -> j
+ HaskellWorks.Data.Json.Token.Types: jsonTokenString :: JsonTokenLike j => String -> j
+ HaskellWorks.Data.Json.Token.Types: jsonTokenWhitespace :: JsonTokenLike j => j

Files

hw-succinct.cabal view
@@ -1,5 +1,5 @@ name:                   hw-succinct-version:                0.0.0.10+version:                0.0.0.11 synopsis:               Conduits for tokenizing streams. description:            Please see README.md homepage:               http://github.com/haskell-works/hw-succinct#readme@@ -36,8 +36,7 @@ library   hs-source-dirs:       src   exposed-modules:      HaskellWorks.Data.Attoparsec.Final.Parser-                      , HaskellWorks.Data.Json.Final.Tokenize-                      , HaskellWorks.Data.Json.Final.Tokenize.Internal+                      , HaskellWorks.Data.Json                       , HaskellWorks.Data.Json.Succinct                       , HaskellWorks.Data.Json.Succinct.Cursor                       , HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens@@ -45,6 +44,9 @@                       , HaskellWorks.Data.Json.Succinct.Cursor.CursorType                       , HaskellWorks.Data.Json.Succinct.Cursor.InterestBits                       , HaskellWorks.Data.Json.Succinct.Cursor.Internal+                      , HaskellWorks.Data.Json.Succinct.Cursor.Token+                      , HaskellWorks.Data.Json.Token.Tokenize+                      , HaskellWorks.Data.Json.Token.Types                       , HaskellWorks.Data.Json.Token                       , HaskellWorks.Data.Succinct   build-depends:        base                            >= 4.7  && < 5@@ -66,7 +68,7 @@   type:                 exitcode-stdio-1.0   hs-source-dirs:       test   main-is:              Spec.hs-  other-modules:        HaskellWorks.Data.Json.Final.TokenizeSpec+  other-modules:        HaskellWorks.Data.Json.Token.TokenizeSpec                       , HaskellWorks.Data.Json.Succinct.CursorSpec                       , HaskellWorks.Data.Json.Succinct.Cursor.InterestBitsSpec   build-depends:        base
+ src/HaskellWorks/Data/Json.hs view
@@ -0,0 +1,11 @@+-- |+-- Copyright: 2016 John Ky+-- License: MIT+--+-- Json+module HaskellWorks.Data.Json+    ( module X+    ) where++import           HaskellWorks.Data.Json.Succinct  as X+import           HaskellWorks.Data.Json.Token     as X
− src/HaskellWorks/Data/Json/Final/Tokenize.hs
@@ -1,5 +0,0 @@-module HaskellWorks.Data.Json.Final.Tokenize-    ( parseJsonToken-    ) where--import           HaskellWorks.Data.Json.Final.Tokenize.Internal
− src/HaskellWorks/Data/Json/Final/Tokenize/Internal.hs
@@ -1,122 +0,0 @@-{-# LANGUAGE FlexibleContexts  #-}-{-# LANGUAGE OverloadedStrings #-}--module HaskellWorks.Data.Json.Final.Tokenize.Internal-    ( IsChar(..)-    , JsonToken(..)-    , AFP.Parser(..)-    , parseJsonToken-    , parseJsonTokenString-    , escapedChar-    ) where--import           Control.Applicative-import           Control.Monad-import qualified Data.Attoparsec.ByteString.Char8          as BC-import qualified Data.Attoparsec.Combinator                as AC-import qualified Data.Attoparsec.Types                     as T-import           Data.Bits-import           Data.Char-import           Data.String-import           HaskellWorks.Data.Attoparsec.Final.Parser as AFP-import           HaskellWorks.Data.Char.IsChar-import           HaskellWorks.Data.Json.Token--hexDigitNumeric :: AFP.Parser t => T.Parser t Int-hexDigitNumeric = do-  c <- satisfyChar (\c -> '0' <= c && c <= '9')-  return $ ord c - ord '0'--hexDigitAlphaLower :: AFP.Parser t => T.Parser t Int-hexDigitAlphaLower = do-  c <- satisfyChar (\c -> 'a' <= c && c <= 'z')-  return $ ord c - ord 'a' + 10--hexDigitAlphaUpper :: AFP.Parser t => T.Parser t Int-hexDigitAlphaUpper = do-  c <- satisfyChar (\c -> 'A' <= c && c <= 'Z')-  return $ ord c - ord 'A' + 10--hexDigit :: AFP.Parser t => T.Parser t Int-hexDigit = hexDigitNumeric <|> hexDigitAlphaLower <|> hexDigitAlphaUpper--verbatimChar :: AFP.Parser t => T.Parser t Char-verbatimChar  = satisfyChar (BC.notInClass "\"\\") <?> "invalid string character"--escapedChar :: (IsString t, AFP.Parser t) => T.Parser t Char-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 :: (IsString t, AFP.Parser t) => T.Parser t Char-escapedCode   = do-  _ <- string "\\u"-  a <- hexDigit-  b <- hexDigit-  c <- hexDigit-  d <- hexDigit-  return $ chr $ a `shift` 24 .|. b `shift` 16 .|. c `shift` 8 .|. d--parseJsonTokenString :: (JsonTokenLike j, AFP.Parser t, Alternative (T.Parser t), IsString t) => T.Parser t j-parseJsonTokenString = do-  _ <- string "\""-  value <- many (verbatimChar <|> escapedChar <|> escapedCode)-  _ <- string "\""-  return $ jsonTokenString value--parseJsonTokenBraceL :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j-parseJsonTokenBraceL = string "{" >> return jsonTokenBraceL--parseJsonTokenBraceR :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j-parseJsonTokenBraceR = string "}" >> return jsonTokenBraceR--parseJsonTokenBracketL :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j-parseJsonTokenBracketL = string "[" >> return jsonTokenBracketL--parseJsonTokenBracketR :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j-parseJsonTokenBracketR = string "]" >> return jsonTokenBracketR--parseJsonTokenComma :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j-parseJsonTokenComma = string "," >> return jsonTokenComma--parseJsonTokenColon :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j-parseJsonTokenColon = string ":" >> return jsonTokenColon--parseJsonTokenWhitespace :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j-parseJsonTokenWhitespace = do-  _ <- AC.many1' $ BC.choice [string " ", string "\t", string "\n", string "\r"]-  return jsonTokenWhitespace--parseJsonTokenNull :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j-parseJsonTokenNull = string "null" >> return jsonTokenNull--parseJsonTokenBoolean :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j-parseJsonTokenBoolean = true <|> false-  where-    true  = string "true"   >> return (jsonTokenBoolean True)-    false = string "false"  >> return (jsonTokenBoolean False)--parseJsonTokenDouble :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j-parseJsonTokenDouble = liftM jsonTokenNumber rational--parseJsonToken :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j-parseJsonToken =-  parseJsonTokenString     <|>-  parseJsonTokenBraceL     <|>-  parseJsonTokenBraceR     <|>-  parseJsonTokenBracketL   <|>-  parseJsonTokenBracketR   <|>-  parseJsonTokenComma      <|>-  parseJsonTokenColon      <|>-  parseJsonTokenWhitespace <|>-  parseJsonTokenNull       <|>-  parseJsonTokenBoolean    <|>-  parseJsonTokenDouble
src/HaskellWorks/Data/Json/Succinct/Cursor.hs view
@@ -1,28 +1,8 @@-{-# LANGUAGE FlexibleContexts      #-}-{-# LANGUAGE FlexibleInstances     #-}-{-# LANGUAGE InstanceSigs          #-}-{-# LANGUAGE MultiParamTypeClasses #-}  module HaskellWorks.Data.Json.Succinct.Cursor   ( module X-  , jsonTokenAt   ) where -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-import           HaskellWorks.Data.Positioning-import           HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Rank1-import           HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Select1-import           HaskellWorks.Data.Vector.VectorLike--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+import           HaskellWorks.Data.Json.Succinct.Cursor.Token               as X
+ src/HaskellWorks/Data/Json/Succinct/Cursor/Token.hs view
@@ -0,0 +1,23 @@++module HaskellWorks.Data.Json.Succinct.Cursor.Token+  ( jsonTokenAt+  ) where++import qualified Data.Attoparsec.ByteString.Char8                           as ABC+import           Data.ByteString.Internal                                   as BSI+import           HaskellWorks.Data.Bits.BitWise+import           HaskellWorks.Data.Json.Succinct.Cursor.CursorType+import           HaskellWorks.Data.Json.Succinct.Cursor.Internal+import           HaskellWorks.Data.Json.Token.Tokenize+import           HaskellWorks.Data.Positioning+import           HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Rank1+import           HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Select1+import           HaskellWorks.Data.Vector.VectorLike++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
src/HaskellWorks/Data/Json/Token.hs view
@@ -1,41 +1,6 @@-module HaskellWorks.Data.Json.Token (JsonToken(..), JsonTokenLike(..)) where--class JsonTokenLike j where-  jsonTokenBraceL     :: j-  jsonTokenBraceR     :: j-  jsonTokenBracketL   :: j-  jsonTokenBracketR   :: j-  jsonTokenComma      :: j-  jsonTokenColon      :: j-  jsonTokenWhitespace :: j-  jsonTokenString     :: String -> j-  jsonTokenBoolean    :: Bool -> j-  jsonTokenNumber     :: Double -> j-  jsonTokenNull       :: j--data JsonToken-  = JsonTokenBraceL-  | JsonTokenBraceR-  | JsonTokenBracketL-  | JsonTokenBracketR-  | JsonTokenComma-  | JsonTokenColon-  | JsonTokenWhitespace-  | JsonTokenString String-  | JsonTokenBoolean Bool-  | JsonTokenNumber Double-  | JsonTokenNull-  deriving (Eq, Show)+module HaskellWorks.Data.Json.Token+  ( module X+  ) where -instance JsonTokenLike JsonToken where-  jsonTokenBraceL     = JsonTokenBraceL-  jsonTokenBraceR     = JsonTokenBraceR-  jsonTokenBracketL   = JsonTokenBracketL-  jsonTokenBracketR   = JsonTokenBracketR-  jsonTokenComma      = JsonTokenComma-  jsonTokenColon      = JsonTokenColon-  jsonTokenWhitespace = JsonTokenWhitespace-  jsonTokenString     = JsonTokenString-  jsonTokenBoolean    = JsonTokenBoolean-  jsonTokenNumber     = JsonTokenNumber-  jsonTokenNull       = JsonTokenNull+  import           HaskellWorks.Data.Json.Token.Types as X+  import           HaskellWorks.Data.Json.Token.Tokenize as X
+ src/HaskellWorks/Data/Json/Token/Tokenize.hs view
@@ -0,0 +1,122 @@+{-# LANGUAGE FlexibleContexts  #-}+{-# LANGUAGE OverloadedStrings #-}++module HaskellWorks.Data.Json.Token.Tokenize+    ( IsChar(..)+    , JsonToken(..)+    , AFP.Parser(..)+    , parseJsonToken+    , parseJsonTokenString+    , escapedChar+    ) where++import           Control.Applicative+import           Control.Monad+import qualified Data.Attoparsec.ByteString.Char8          as BC+import qualified Data.Attoparsec.Combinator                as AC+import qualified Data.Attoparsec.Types                     as T+import           Data.Bits+import           Data.Char+import           Data.String+import           HaskellWorks.Data.Attoparsec.Final.Parser as AFP+import           HaskellWorks.Data.Char.IsChar+import           HaskellWorks.Data.Json.Token.Types++hexDigitNumeric :: AFP.Parser t => T.Parser t Int+hexDigitNumeric = do+  c <- satisfyChar (\c -> '0' <= c && c <= '9')+  return $ ord c - ord '0'++hexDigitAlphaLower :: AFP.Parser t => T.Parser t Int+hexDigitAlphaLower = do+  c <- satisfyChar (\c -> 'a' <= c && c <= 'z')+  return $ ord c - ord 'a' + 10++hexDigitAlphaUpper :: AFP.Parser t => T.Parser t Int+hexDigitAlphaUpper = do+  c <- satisfyChar (\c -> 'A' <= c && c <= 'Z')+  return $ ord c - ord 'A' + 10++hexDigit :: AFP.Parser t => T.Parser t Int+hexDigit = hexDigitNumeric <|> hexDigitAlphaLower <|> hexDigitAlphaUpper++verbatimChar :: AFP.Parser t => T.Parser t Char+verbatimChar  = satisfyChar (BC.notInClass "\"\\") <?> "invalid string character"++escapedChar :: (IsString t, AFP.Parser t) => T.Parser t Char+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 :: (IsString t, AFP.Parser t) => T.Parser t Char+escapedCode   = do+  _ <- string "\\u"+  a <- hexDigit+  b <- hexDigit+  c <- hexDigit+  d <- hexDigit+  return $ chr $ a `shift` 24 .|. b `shift` 16 .|. c `shift` 8 .|. d++parseJsonTokenString :: (JsonTokenLike j, AFP.Parser t, Alternative (T.Parser t), IsString t) => T.Parser t j+parseJsonTokenString = do+  _ <- string "\""+  value <- many (verbatimChar <|> escapedChar <|> escapedCode)+  _ <- string "\""+  return $ jsonTokenString value++parseJsonTokenBraceL :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j+parseJsonTokenBraceL = string "{" >> return jsonTokenBraceL++parseJsonTokenBraceR :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j+parseJsonTokenBraceR = string "}" >> return jsonTokenBraceR++parseJsonTokenBracketL :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j+parseJsonTokenBracketL = string "[" >> return jsonTokenBracketL++parseJsonTokenBracketR :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j+parseJsonTokenBracketR = string "]" >> return jsonTokenBracketR++parseJsonTokenComma :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j+parseJsonTokenComma = string "," >> return jsonTokenComma++parseJsonTokenColon :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j+parseJsonTokenColon = string ":" >> return jsonTokenColon++parseJsonTokenWhitespace :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j+parseJsonTokenWhitespace = do+  _ <- AC.many1' $ BC.choice [string " ", string "\t", string "\n", string "\r"]+  return jsonTokenWhitespace++parseJsonTokenNull :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j+parseJsonTokenNull = string "null" >> return jsonTokenNull++parseJsonTokenBoolean :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j+parseJsonTokenBoolean = true <|> false+  where+    true  = string "true"   >> return (jsonTokenBoolean True)+    false = string "false"  >> return (jsonTokenBoolean False)++parseJsonTokenDouble :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j+parseJsonTokenDouble = liftM jsonTokenNumber rational++parseJsonToken :: (JsonTokenLike j, AFP.Parser t, IsString t) => T.Parser t j+parseJsonToken =+  parseJsonTokenString     <|>+  parseJsonTokenBraceL     <|>+  parseJsonTokenBraceR     <|>+  parseJsonTokenBracketL   <|>+  parseJsonTokenBracketR   <|>+  parseJsonTokenComma      <|>+  parseJsonTokenColon      <|>+  parseJsonTokenWhitespace <|>+  parseJsonTokenNull       <|>+  parseJsonTokenBoolean    <|>+  parseJsonTokenDouble
+ src/HaskellWorks/Data/Json/Token/Types.hs view
@@ -0,0 +1,41 @@+module HaskellWorks.Data.Json.Token.Types (JsonToken(..), JsonTokenLike(..)) where++class JsonTokenLike j where+  jsonTokenBraceL     :: j+  jsonTokenBraceR     :: j+  jsonTokenBracketL   :: j+  jsonTokenBracketR   :: j+  jsonTokenComma      :: j+  jsonTokenColon      :: j+  jsonTokenWhitespace :: j+  jsonTokenString     :: String -> j+  jsonTokenBoolean    :: Bool -> j+  jsonTokenNumber     :: Double -> j+  jsonTokenNull       :: j++data JsonToken+  = JsonTokenBraceL+  | JsonTokenBraceR+  | JsonTokenBracketL+  | JsonTokenBracketR+  | JsonTokenComma+  | JsonTokenColon+  | JsonTokenWhitespace+  | JsonTokenString String+  | JsonTokenBoolean Bool+  | JsonTokenNumber Double+  | JsonTokenNull+  deriving (Eq, Show)++instance JsonTokenLike JsonToken where+  jsonTokenBraceL     = JsonTokenBraceL+  jsonTokenBraceR     = JsonTokenBraceR+  jsonTokenBracketL   = JsonTokenBracketL+  jsonTokenBracketR   = JsonTokenBracketR+  jsonTokenComma      = JsonTokenComma+  jsonTokenColon      = JsonTokenColon+  jsonTokenWhitespace = JsonTokenWhitespace+  jsonTokenString     = JsonTokenString+  jsonTokenBoolean    = JsonTokenBoolean+  jsonTokenNumber     = JsonTokenNumber+  jsonTokenNull       = JsonTokenNull
− test/HaskellWorks/Data/Json/Final/TokenizeSpec.hs
@@ -1,50 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module HaskellWorks.Data.Json.Final.TokenizeSpec (spec) where--import qualified Data.Attoparsec.ByteString.Char8      as BC-import           Data.ByteString                       as BS-import           HaskellWorks.Data.Json.Final.Tokenize-import           HaskellWorks.Data.Json.Token-import           Test.Hspec--{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}--parseJsonToken' :: ByteString -> Either String JsonToken-parseJsonToken' = BC.parseOnly parseJsonToken--spec :: Spec-spec = describe "Data.Conduit.Succinct.JsonSpec" $ do-  describe "When parsing single token at beginning of text" $ do-    it "Empty Json should produce no bits" $-      parseJsonToken' "" `shouldBe` Left "not enough input"-    it "Json with one space should produce whitespace token" $-      parseJsonToken' " " `shouldBe` Right JsonTokenWhitespace-    it "Json with two spaces should produce whitespace token" $-      parseJsonToken' "  " `shouldBe` Right JsonTokenWhitespace-    it "Spaces and newlines should produce no bits" $-      parseJsonToken' "  \n \r \t " `shouldBe` Right JsonTokenWhitespace-    it "`null` at beginning should produce one bit" $-      parseJsonToken' "null " `shouldBe` Right JsonTokenNull-    it "number at beginning should produce one bit" $-      parseJsonToken' "1234 " `shouldBe` Right (JsonTokenNumber 1234)-    it "false at beginning should produce one bit" $-      parseJsonToken' "false " `shouldBe` Right (JsonTokenBoolean False)-    it "true at beginning should produce one bit" $-      parseJsonToken' "true " `shouldBe` Right (JsonTokenBoolean True)-    it "string at beginning should produce one bit" $-      parseJsonToken' "\"hello\" " `shouldBe` Right (JsonTokenString "hello")-    it "quoted string should parse" $-      parseJsonToken' "\"\\\"\" " `shouldBe` Right (JsonTokenString "\"")-    it "left brace at beginning should produce one bit" $-      parseJsonToken' "{ " `shouldBe` Right JsonTokenBraceL-    it "right brace at beginning should produce one bit" $-      parseJsonToken' "} " `shouldBe` Right JsonTokenBraceR-    it "left bracket at beginning should produce one bit" $-      parseJsonToken' "[ " `shouldBe` Right JsonTokenBracketL-    it "right bracket at beginning should produce one bit" $-      parseJsonToken' "] " `shouldBe` Right JsonTokenBracketR-    it "right bracket at beginning should produce one bit" $-      parseJsonToken' ": " `shouldBe` Right JsonTokenColon-    it "right bracket at beginning should produce one bit" $-      parseJsonToken' ", " `shouldBe` Right JsonTokenComma
+ test/HaskellWorks/Data/Json/Token/TokenizeSpec.hs view
@@ -0,0 +1,49 @@+{-# LANGUAGE OverloadedStrings #-}++module HaskellWorks.Data.Json.Token.TokenizeSpec (spec) where++import qualified Data.Attoparsec.ByteString.Char8      as BC+import           Data.ByteString                       as BS+import           HaskellWorks.Data.Json.Token.Tokenize+import           Test.Hspec++{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}++parseJsonToken' :: ByteString -> Either String JsonToken+parseJsonToken' = BC.parseOnly parseJsonToken++spec :: Spec+spec = describe "Data.Conduit.Succinct.JsonSpec" $ do+  describe "When parsing single token at beginning of text" $ do+    it "Empty Json should produce no bits" $+      parseJsonToken' "" `shouldBe` Left "not enough input"+    it "Json with one space should produce whitespace token" $+      parseJsonToken' " " `shouldBe` Right JsonTokenWhitespace+    it "Json with two spaces should produce whitespace token" $+      parseJsonToken' "  " `shouldBe` Right JsonTokenWhitespace+    it "Spaces and newlines should produce no bits" $+      parseJsonToken' "  \n \r \t " `shouldBe` Right JsonTokenWhitespace+    it "`null` at beginning should produce one bit" $+      parseJsonToken' "null " `shouldBe` Right JsonTokenNull+    it "number at beginning should produce one bit" $+      parseJsonToken' "1234 " `shouldBe` Right (JsonTokenNumber 1234)+    it "false at beginning should produce one bit" $+      parseJsonToken' "false " `shouldBe` Right (JsonTokenBoolean False)+    it "true at beginning should produce one bit" $+      parseJsonToken' "true " `shouldBe` Right (JsonTokenBoolean True)+    it "string at beginning should produce one bit" $+      parseJsonToken' "\"hello\" " `shouldBe` Right (JsonTokenString "hello")+    it "quoted string should parse" $+      parseJsonToken' "\"\\\"\" " `shouldBe` Right (JsonTokenString "\"")+    it "left brace at beginning should produce one bit" $+      parseJsonToken' "{ " `shouldBe` Right JsonTokenBraceL+    it "right brace at beginning should produce one bit" $+      parseJsonToken' "} " `shouldBe` Right JsonTokenBraceR+    it "left bracket at beginning should produce one bit" $+      parseJsonToken' "[ " `shouldBe` Right JsonTokenBracketL+    it "right bracket at beginning should produce one bit" $+      parseJsonToken' "] " `shouldBe` Right JsonTokenBracketR+    it "right bracket at beginning should produce one bit" $+      parseJsonToken' ": " `shouldBe` Right JsonTokenColon+    it "right bracket at beginning should produce one bit" $+      parseJsonToken' ", " `shouldBe` Right JsonTokenComma