packages feed

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