on master help sign in
Factor the arrayValues loop into its own function
commit9b7824d279675c5d8d316d2179c65a0165965491 authorBryan O'Sullivan <bos@serpentine.com> dateTue 26 Nov 2013, 14:51 (13 years ago) parent94e087c
1 file changed+18−10
Data/Aeson/Parser/Internal.hs+18−10
Data/Aeson/Parser/Internal.hs+18−10
@@ -118,17 +118,21 @@ array_' = {-# SCC "array_'" #-} do
118118 !vals <- arrayValues value'
119119 return (Array vals)
120120
121+commaSeparated :: Parser a -> Word8 -> Parser [a]
122+commaSeparated item endByte = loop
123+ where
124+ loop = do
125+ v <- item <* skipSpace
126+ ch <- A.satisfy $ \w -> w == comma || w == endByte
127+ if ch == comma
128+ then skipSpace >> (v:) <$> loop
129+ else return [v]
130+{-# INLINE commaSeparated #-}
131+
121132arrayValues :: Parser Value -> Parser (Vector Value)
122133arrayValues val = do
123134 skipSpace
124− let loop = do
125− v <- val <* skipSpace
126− -- chr 44 == ',' && chr 93 == ']'
127− ch <- A.satisfy $ \w -> w == 44 || w == 93
128− if ch == 44
129− then skipSpace >> (v:) <$> loop
130− else return [v]
131− Vector.fromList <$> loop
135+ Vector.fromList <$> commaSeparated val closeSquare
132136{-# INLINE arrayValues #-}
133137
134138-- | Parse any JSON value. You should usually 'json' in preference to
@@ -175,10 +179,14 @@ value' = most <|> num
175179 !n <- rational
176180 return (Number n)
177181
178−doubleQuote, backslash :: Word8
179−doubleQuote = 34
182+backslash, closeSquare, comma, doubleQuote :: Word8
180183backslash = 92
184+closeSquare = 93
185+comma = 44
186+doubleQuote = 34
181187{-# INLINE backslash #-}
188+{-# INLINE closeSquare #-}
189+{-# INLINE comma #-}
182190{-# INLINE doubleQuote #-}
183191
184192-- | Parse a quoted JSON string.