diff --git a/src/Language/Json.hs b/src/Language/Json.hs index 05e156d..d99ddcb 100644 --- a/src/Language/Json.hs +++ b/src/Language/Json.hs @@ -227,6 +227,7 @@ keyValue = do val <- value -- result + whitespace pure (name, val) object :: Parser (Map Text Value) @@ -234,9 +235,10 @@ object = do _ <- Parser.char '{' whitespace - members <- (keyValue <* whitespace) `Parser.sepBy` comma + members <- keyValue `Parser.sepBy` comma _ <- Parser.char '}' + whitespace pure $ Map.fromList members whitespace :: Parser () @@ -250,5 +252,8 @@ array = do elements <- value `Parser.sepBy` comma _ <- Parser.char ']' - pure $ Array.listArray (0, fromIntegral $ length elements - 1) elements + whitespace + pure $ case elements of + [] -> Array.listArray (1, 0) elements + _ -> Array.listArray (0, fromIntegral $ length elements - 1) elements diff --git a/src/Language/Json/Parser.hs b/src/Language/Json/Parser.hs index 1cfb6d2..d12769a 100644 --- a/src/Language/Json/Parser.hs +++ b/src/Language/Json/Parser.hs @@ -88,10 +88,10 @@ times n body = go n sepBy :: Parser a -> Parser b -> Parser [a] sepBy p sep = do - first <- p + first <- optional p rest <- sep *> sepBy p sep <|> pure [] - pure $ first : rest + pure $ maybe id (:) first rest eof :: Parser Bool eof = anyChar *> empty <|> pure True