hw-succinct 0.0.0.12 → 0.0.0.13
raw patch · 10 files changed
+237/−114 lines, 10 filesdep +containersdep +word8PVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: containers, word8
API changes (from Hackage documentation)
- HaskellWorks.Data.Json.Token.Tokenize: escapedChar :: (IsString t, Parser t) => Parser t Char
- HaskellWorks.Data.Json.Token.Types: class JsonTokenLike j
- 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
+ HaskellWorks.Data.Json.Succinct.Cursor.FromJsonCursor: class FromJsonCursor t v w a
+ HaskellWorks.Data.Json.Succinct.Cursor.FromJsonCursor: fromJsonCursor :: FromJsonCursor t v w a => JsonCursor t v w -> a
+ HaskellWorks.Data.Json.Succinct.Cursor.FromJsonCursor: instance (HaskellWorks.Data.TreeCursor.TreeCursor (HaskellWorks.Data.Json.Succinct.Cursor.Internal.JsonCursor Data.ByteString.Internal.ByteString v w), HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Rank1.Rank1 w, HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Select1.Select1 v, HaskellWorks.Data.Bits.BitWise.TestBit w) => HaskellWorks.Data.Json.Succinct.Cursor.FromJsonCursor.FromJsonCursor Data.ByteString.Internal.ByteString v w (HaskellWorks.Data.Json.Value.JsonValue Data.ByteString.Internal.ByteString Data.ByteString.Internal.ByteString)
+ HaskellWorks.Data.Json.Succinct.Cursor.Internal: instance HaskellWorks.Data.Bits.BitWise.TestBit w => HaskellWorks.Data.Json.Type.JsonTypeAt (HaskellWorks.Data.Json.Succinct.Cursor.Internal.JsonCursor Data.ByteString.Internal.ByteString v w)
+ HaskellWorks.Data.Json.Succinct.Cursor.Internal: instance HaskellWorks.Data.Bits.BitWise.TestBit w => HaskellWorks.Data.Json.Value.JsonValueAt Data.ByteString.Internal.ByteString Data.ByteString.Internal.ByteString (HaskellWorks.Data.Json.Succinct.Cursor.Internal.JsonCursor Data.ByteString.Internal.ByteString v w)
+ HaskellWorks.Data.Json.Token.Tokenize: class ParseJson t s d where parseJsonToken = parseJsonTokenString <|> parseJsonTokenBraceL <|> parseJsonTokenBraceR <|> parseJsonTokenBracketL <|> parseJsonTokenBracketR <|> parseJsonTokenComma <|> parseJsonTokenColon <|> parseJsonTokenWhitespace <|> parseJsonTokenNull <|> parseJsonTokenBoolean <|> parseJsonTokenDouble
+ 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: 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: parseJsonTokenWhitespace :: ParseJson t s d => Parser t (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.Type: JsonTypeArray :: JsonType
+ HaskellWorks.Data.Json.Type: JsonTypeBool :: JsonType
+ HaskellWorks.Data.Json.Type: JsonTypeNull :: JsonType
+ HaskellWorks.Data.Json.Type: JsonTypeNumber :: JsonType
+ HaskellWorks.Data.Json.Type: JsonTypeObject :: JsonType
+ HaskellWorks.Data.Json.Type: JsonTypeString :: JsonType
+ HaskellWorks.Data.Json.Type: class JsonTypeAt a
+ HaskellWorks.Data.Json.Type: data JsonType
+ HaskellWorks.Data.Json.Type: jsonTypeAt :: JsonTypeAt a => a -> Maybe JsonType
+ HaskellWorks.Data.Json.Type: jsonTypeAtPosition :: JsonTypeAt a => Position -> a -> Maybe JsonType
+ HaskellWorks.Data.Json.Value: JsonArray :: [JsonValue s n] -> JsonValue s n
+ HaskellWorks.Data.Json.Value: JsonBool :: Bool -> JsonValue s n
+ HaskellWorks.Data.Json.Value: JsonNull :: JsonValue s n
+ HaskellWorks.Data.Json.Value: JsonNumber :: n -> JsonValue s n
+ HaskellWorks.Data.Json.Value: JsonObject :: (Map s (JsonValue s n)) -> JsonValue s n
+ HaskellWorks.Data.Json.Value: JsonString :: s -> JsonValue s n
+ HaskellWorks.Data.Json.Value: class JsonValueAt s n a
+ HaskellWorks.Data.Json.Value: data JsonValue s n
+ HaskellWorks.Data.Json.Value: jsonValueAt :: JsonValueAt s n a => a -> Maybe (JsonValue s n)
- HaskellWorks.Data.Json.Succinct.Cursor.Token: jsonTokenAt :: (Rank1 w, Select1 v, TestBit w) => JsonCursor ByteString v w -> Maybe JsonToken
+ HaskellWorks.Data.Json.Succinct.Cursor.Token: jsonTokenAt :: (Rank1 w, Select1 v, TestBit w) => JsonCursor ByteString v w -> Maybe (JsonToken String Double)
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBoolean :: Bool -> JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBoolean :: Bool -> JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBraceL :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBraceL :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBraceR :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBraceR :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBracketL :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBracketL :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBracketR :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenBracketR :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenColon :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenColon :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenComma :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenComma :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenNull :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenNull :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenNumber :: Double -> JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenNumber :: d -> JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenString :: String -> JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenString :: s -> JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: JsonTokenWhitespace :: JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: JsonTokenWhitespace :: JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: data JsonToken
+ HaskellWorks.Data.Json.Token.Tokenize: data JsonToken s d
- HaskellWorks.Data.Json.Token.Tokenize: parseJsonToken :: (JsonTokenLike j, Parser t, IsString t) => Parser t j
+ HaskellWorks.Data.Json.Token.Tokenize: parseJsonToken :: ParseJson t s d => Parser t (JsonToken s d)
- HaskellWorks.Data.Json.Token.Tokenize: parseJsonTokenString :: (JsonTokenLike j, Parser t, Alternative (Parser t), IsString t) => Parser t j
+ HaskellWorks.Data.Json.Token.Tokenize: parseJsonTokenString :: ParseJson t s d => Parser t (JsonToken s d)
- HaskellWorks.Data.Json.Token.Types: JsonTokenBoolean :: Bool -> JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenBoolean :: Bool -> JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenBraceL :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenBraceL :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenBraceR :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenBraceR :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenBracketL :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenBracketL :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenBracketR :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenBracketR :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenColon :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenColon :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenComma :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenComma :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenNull :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenNull :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenNumber :: Double -> JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenNumber :: d -> JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenString :: String -> JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenString :: s -> JsonToken s d
- HaskellWorks.Data.Json.Token.Types: JsonTokenWhitespace :: JsonToken
+ HaskellWorks.Data.Json.Token.Types: JsonTokenWhitespace :: JsonToken s d
- HaskellWorks.Data.Json.Token.Types: data JsonToken
+ HaskellWorks.Data.Json.Token.Types: data JsonToken s d
Files
- hw-succinct.cabal +6/−1
- src/HaskellWorks/Data/Json/Succinct/Cursor/FromJsonCursor.hs +33/−0
- src/HaskellWorks/Data/Json/Succinct/Cursor/Internal.hs +37/−0
- src/HaskellWorks/Data/Json/Succinct/Cursor/Token.hs +1/−1
- src/HaskellWorks/Data/Json/Token.hs +2/−2
- src/HaskellWorks/Data/Json/Token/Tokenize.hs +122/−79
- src/HaskellWorks/Data/Json/Token/Types.hs +4/−30
- src/HaskellWorks/Data/Json/Type.hs +15/−0
- src/HaskellWorks/Data/Json/Value.hs +16/−0
- test/HaskellWorks/Data/Json/Token/TokenizeSpec.hs +1/−1
hw-succinct.cabal view
@@ -1,5 +1,5 @@ name: hw-succinct-version: 0.0.0.12+version: 0.0.0.13 synopsis: Conduits for tokenizing streams. description: Please see README.md homepage: http://github.com/haskell-works/hw-succinct#readme@@ -41,17 +41,21 @@ , HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens , HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson , HaskellWorks.Data.Json.Succinct.Cursor.CursorType+ , HaskellWorks.Data.Json.Succinct.Cursor.FromJsonCursor , 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.Json.Type+ , HaskellWorks.Data.Json.Value , HaskellWorks.Data.Succinct build-depends: base >= 4.7 && < 5 , attoparsec , bytestring , conduit+ , containers , hw-bits , hw-conduit , hw-parser@@ -60,6 +64,7 @@ , mono-traversable , text , vector+ , word8 default-language: Haskell2010 ghc-options: -rtsopts -with-rtsopts=-N -Wall -O2 -Wall -msse4.2
+ src/HaskellWorks/Data/Json/Succinct/Cursor/FromJsonCursor.hs view
@@ -0,0 +1,33 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++module HaskellWorks.Data.Json.Succinct.Cursor.FromJsonCursor where++import qualified Data.ByteString as BS+import HaskellWorks.Data.Bits.BitWise+import HaskellWorks.Data.Json.Succinct.Cursor.Internal+import HaskellWorks.Data.Json.Succinct.Cursor.Token+import HaskellWorks.Data.Json.Value+import HaskellWorks.Data.Json.Token.Types+import HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Rank1+import HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Select1+import HaskellWorks.Data.TreeCursor++class FromJsonCursor t v w a where+ fromJsonCursor :: JsonCursor t v w -> a++instance (TreeCursor (JsonCursor BS.ByteString v w), Rank1 w, Select1 v, TestBit w) => FromJsonCursor BS.ByteString v w (JsonValue BS.ByteString BS.ByteString) where+ fromJsonCursor k = case jsonTokenAt k of+ Just JsonTokenBraceL -> undefined+ Just JsonTokenBraceR -> undefined+ Just JsonTokenBracketL -> undefined+ Just JsonTokenBracketR -> undefined+ Just JsonTokenComma -> undefined+ Just JsonTokenColon -> undefined+ Just JsonTokenWhitespace -> undefined+ Just (JsonTokenString _) -> undefined+ Just (JsonTokenBoolean value) -> JsonBool value+ Just (JsonTokenNumber _) -> undefined+ Just JsonTokenNull -> undefined+ Nothing -> undefined
src/HaskellWorks/Data/Json/Succinct/Cursor/Internal.hs view
@@ -13,19 +13,24 @@ import Data.String import qualified Data.Vector.Storable as DVS import Data.Word+import Data.Word8 import Foreign.ForeignPtr import HaskellWorks.Data.Bits.BitShown+import HaskellWorks.Data.Bits.BitWise import HaskellWorks.Data.FromByteString import HaskellWorks.Data.FromForeignRegion import HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens import HaskellWorks.Data.Json.Succinct.Cursor.BlankedJson import HaskellWorks.Data.Json.Succinct.Cursor.InterestBits+import HaskellWorks.Data.Json.Type+import HaskellWorks.Data.Json.Value import HaskellWorks.Data.Positioning import HaskellWorks.Data.Succinct.BalancedParens as BP import HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Rank0 import HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Rank1 import HaskellWorks.Data.Succinct.RankSelect.Binary.Poppy512 import HaskellWorks.Data.TreeCursor+import HaskellWorks.Data.Vector.VectorLike data JsonCursor t v w = JsonCursor { cursorText :: !t@@ -102,3 +107,35 @@ subtreeSize :: JsonCursor t v u -> Count subtreeSize k = BP.subtreeSize (balancedParens k) (cursorRank k)++wIsJsonNumberDigit :: Word8 -> Bool+wIsJsonNumberDigit w = (w >= _0 && w <= _9) || w == _hyphen++instance TestBit w => JsonTypeAt (JsonCursor BS.ByteString v w) where+ jsonTypeAtPosition p k = if balancedParens k .?. p+ then case cursorText k !!! p of+ c | c == _bracketleft -> Just JsonTypeArray+ c | c == _t -> Just JsonTypeBool+ c | c == _n -> Just JsonTypeNull+ c | wIsJsonNumberDigit c -> Just JsonTypeNumber+ c | c == _braceleft -> Just JsonTypeObject+ c | c == _quotedbl -> Just JsonTypeString+ _ -> Nothing+ else Nothing++ jsonTypeAt k = jsonTypeAtPosition (lastPositionOf (cursorRank k)) k++instance TestBit w => JsonValueAt BS.ByteString BS.ByteString (JsonCursor BS.ByteString v w) where+ jsonValueAt :: JsonCursor BS.ByteString v w -> Maybe (JsonValue BS.ByteString BS.ByteString)+ jsonValueAt k = case jsonTypeAtPosition p k of+ Just JsonTypeArray -> error "Not Implemented"+ Just JsonTypeBool -> case cursorText k !!! p of+ c | c == _t -> Just $ JsonBool True+ c | c == _t -> Just $ JsonBool False+ _ -> Nothing+ Just JsonTypeNull -> Just JsonNull+ Just JsonTypeNumber -> error "Not Implemented"+ Just JsonTypeObject -> error "Not Implemented"+ Just JsonTypeString -> error "Not Implemented"+ Nothing -> Nothing+ where p = lastPositionOf (cursorRank k)
src/HaskellWorks/Data/Json/Succinct/Cursor/Token.hs view
@@ -14,7 +14,7 @@ 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 :: (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 (vDrop (toCount (jsonCursorPos k)) (cursorText k)) of ABC.Fail {} -> error "Failed to parse token in cursor"
src/HaskellWorks/Data/Json/Token.hs view
@@ -2,5 +2,5 @@ ( module X ) where - import HaskellWorks.Data.Json.Token.Types as X- import HaskellWorks.Data.Json.Token.Tokenize as X+import HaskellWorks.Data.Json.Token.Types as X+import HaskellWorks.Data.Json.Token.Tokenize as X
src/HaskellWorks/Data/Json/Token/Tokenize.hs view
@@ -1,25 +1,27 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TypeSynonymInstances #-} module HaskellWorks.Data.Json.Token.Tokenize ( IsChar(..) , JsonToken(..)- , parseJsonToken- , parseJsonTokenString- , escapedChar+ , ParseJson(..) ) 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 qualified Data.ByteString as BS import Data.Bits import Data.Char-import Data.String-import HaskellWorks.Data.Parser as P+import Data.Word+import Data.Word8 import HaskellWorks.Data.Char.IsChar import HaskellWorks.Data.Json.Token.Types+import HaskellWorks.Data.Parser as P hexDigitNumeric :: P.Parser t => T.Parser t Int hexDigitNumeric = do@@ -39,83 +41,124 @@ hexDigit :: P.Parser t => T.Parser t Int hexDigit = hexDigitNumeric <|> hexDigitAlphaLower <|> hexDigitAlphaUpper -verbatimChar :: P.Parser t => T.Parser t Char-verbatimChar = satisfyChar (BC.notInClass "\"\\") <?> "invalid string character"--escapedChar :: (IsString t, P.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, P.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, P.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, P.Parser t, IsString t) => T.Parser t j-parseJsonTokenBraceL = string "{" >> return jsonTokenBraceL--parseJsonTokenBraceR :: (JsonTokenLike j, P.Parser t, IsString t) => T.Parser t j-parseJsonTokenBraceR = string "}" >> return jsonTokenBraceR+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) -parseJsonTokenBracketL :: (JsonTokenLike j, P.Parser t, IsString t) => T.Parser t j-parseJsonTokenBracketL = string "[" >> return jsonTokenBracketL+ parseJsonToken =+ parseJsonTokenString <|>+ parseJsonTokenBraceL <|>+ parseJsonTokenBraceR <|>+ parseJsonTokenBracketL <|>+ parseJsonTokenBracketR <|>+ parseJsonTokenComma <|>+ parseJsonTokenColon <|>+ parseJsonTokenWhitespace <|>+ parseJsonTokenNull <|>+ parseJsonTokenBoolean <|>+ parseJsonTokenDouble -parseJsonTokenBracketR :: (JsonTokenLike j, P.Parser t, IsString t) => T.Parser t j-parseJsonTokenBracketR = string "]" >> return jsonTokenBracketR+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 -parseJsonTokenComma :: (JsonTokenLike j, P.Parser t, IsString t) => T.Parser t j-parseJsonTokenComma = string "," >> return jsonTokenComma+ 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 -parseJsonTokenColon :: (JsonTokenLike j, P.Parser t, IsString t) => T.Parser t j-parseJsonTokenColon = string ":" >> return jsonTokenColon+ parseJsonTokenWhitespace = do+ _ <- AC.many1' $ BC.choice [string " ", string "\t", string "\n", string "\r"]+ return JsonTokenWhitespace -parseJsonTokenWhitespace :: (JsonTokenLike j, P.Parser t, IsString t) => T.Parser t j-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) -parseJsonTokenNull :: (JsonTokenLike j, P.Parser t, IsString t) => T.Parser t j-parseJsonTokenNull = string "null" >> return jsonTokenNull+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 -parseJsonTokenBoolean :: (JsonTokenLike j, P.Parser t, IsString t) => T.Parser t j-parseJsonTokenBoolean = true <|> false- where- true = string "true" >> return (jsonTokenBoolean True)- false = string "false" >> return (jsonTokenBoolean False)+ 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 -parseJsonTokenDouble :: (JsonTokenLike j, P.Parser t, IsString t) => T.Parser t j-parseJsonTokenDouble = liftM jsonTokenNumber rational+ parseJsonTokenWhitespace = do+ _ <- AC.many1' $ BC.choice [string " ", string "\t", string "\n", string "\r"]+ return JsonTokenWhitespace -parseJsonToken :: (JsonTokenLike j, P.Parser t, IsString t) => T.Parser t j-parseJsonToken =- parseJsonTokenString <|>- parseJsonTokenBraceL <|>- parseJsonTokenBraceR <|>- parseJsonTokenBracketL <|>- parseJsonTokenBracketR <|>- parseJsonTokenComma <|>- parseJsonTokenColon <|>- parseJsonTokenWhitespace <|>- parseJsonTokenNull <|>- parseJsonTokenBoolean <|>- parseJsonTokenDouble+ parseJsonTokenBoolean = true <|> false+ where+ true = string "true" >> return (JsonTokenBoolean True)+ false = string "false" >> return (JsonTokenBoolean False)
src/HaskellWorks/Data/Json/Token/Types.hs view
@@ -1,19 +1,6 @@-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+module HaskellWorks.Data.Json.Token.Types (JsonToken(..)) where -data JsonToken+data JsonToken s d = JsonTokenBraceL | JsonTokenBraceR | JsonTokenBracketL@@ -21,21 +8,8 @@ | JsonTokenComma | JsonTokenColon | JsonTokenWhitespace- | JsonTokenString String+ | JsonTokenString s | JsonTokenBoolean Bool- | JsonTokenNumber Double+ | JsonTokenNumber d | 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
+ src/HaskellWorks/Data/Json/Type.hs view
@@ -0,0 +1,15 @@+module HaskellWorks.Data.Json.Type where++import HaskellWorks.Data.Positioning++data JsonType+ = JsonTypeArray+ | JsonTypeBool+ | JsonTypeNull+ | JsonTypeNumber+ | JsonTypeObject+ | JsonTypeString++class JsonTypeAt a where+ jsonTypeAtPosition :: Position -> a -> Maybe JsonType+ jsonTypeAt :: a -> Maybe JsonType
+ src/HaskellWorks/Data/Json/Value.hs view
@@ -0,0 +1,16 @@+{-# LANGUAGE MultiParamTypeClasses #-}++module HaskellWorks.Data.Json.Value where++import Data.Map++data JsonValue s n+ = JsonString s+ | JsonNumber n+ | JsonObject (Map s (JsonValue s n))+ | JsonArray [JsonValue s n]+ | JsonBool Bool+ | JsonNull++class JsonValueAt s n a where+ jsonValueAt :: a -> Maybe (JsonValue s n)
test/HaskellWorks/Data/Json/Token/TokenizeSpec.hs view
@@ -9,7 +9,7 @@ {-# ANN module ("HLint: ignore Redundant do" :: String) #-} -parseJsonToken' :: ByteString -> Either String JsonToken+parseJsonToken' :: ByteString -> Either String (JsonToken String Double) parseJsonToken' = BC.parseOnly parseJsonToken spec :: Spec