From 76e8cea45473e434cced49cedd860a19e3ee6eb6 Mon Sep 17 00:00:00 2001 From: VegOwOtenks Date: Fri, 22 Aug 2025 18:05:22 +0200 Subject: [PATCH] feat: consistent whitespace + non-empty sepBy --- src/Language/Json.hs | 9 +++++++-- src/Language/Json/Parser.hs | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) 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