diff --git a/src/Language/Json.hs b/src/Language/Json.hs index 70f77e1..05e156d 100644 --- a/src/Language/Json.hs +++ b/src/Language/Json.hs @@ -70,6 +70,7 @@ instance Arbitrary PrintableValue where null :: Parser Value null = do Parser.exact "null" + whitespace pure Null true :: Parser Bool @@ -83,7 +84,7 @@ false = do pure False boolean :: Parser Bool -boolean = true <|> false +boolean = (true <|> false) <* whitespace digit :: Parser Int digit = Char.digitToInt <$> Parser.oneOf (Parser.char <$> ['0'..'9']) @@ -138,6 +139,7 @@ number = do decimalPartLength = length . show $ part in fromIntegral (integerPart * 10 ^ decimalPartLength + part) % 10 ^ decimalPartLength + whitespace pure $ concatRational * fromIntegral @Integer (applySign factor (10 ^ Maybe.fromMaybe 0 power)) -- >>> import Language.Json.Parser @@ -153,6 +155,7 @@ string = do _ <- Parser.exact "\"" str <- many stringChar _ <- Parser.exact "\"" + whitespace pure $ Text.pack str @@ -209,15 +212,21 @@ value = Parser.oneOf document :: Parser Value document = whitespace *> value <* whitespace <* Parser.eof -keyvalue :: Parser (Text, Value) -keyvalue = do +comma :: Parser Char +comma = Parser.char ',' <* whitespace + +keyValue :: Parser (Text, Value) +keyValue = do + -- name name <- string - whitespace - _ <- Parser.char ':' - whitespace + -- separator + Parser.char ':' *> whitespace + -- value val <- value + + -- result pure (name, val) object :: Parser (Map Text Value) @@ -225,7 +234,7 @@ object = do _ <- Parser.char '{' whitespace - members <- (keyvalue <* whitespace) `Parser.sepBy` (Parser.char ',' <* whitespace) + members <- (keyValue <* whitespace) `Parser.sepBy` comma _ <- Parser.char '}' pure $ Map.fromList members @@ -238,7 +247,7 @@ array = do _ <- Parser.char '[' whitespace - elements <- (value <* whitespace) `Parser.sepBy` (Parser.char ',' <* whitespace) + elements <- value `Parser.sepBy` comma _ <- Parser.char ']' pure $ Array.listArray (0, fromIntegral $ length elements - 1) elements