on master help sign in
Try to build a Vector a little more efficiently
commit09b2ddc32f6d29d0b502b0790791e5d58fa5ae37 authorBryan O'Sullivan <bos@serpentine.com> dateFri 10 Jul 2015, 15:36 (11 years ago) parenta25235e
1 file changed+5−5
Data/Aeson/Parser/Internal.hs+5−5
Data/Aeson/Parser/Internal.hs+5−5
@@ -40,7 +40,7 @@ import Data.Text (Text)
4040import Data.Text.Encoding (decodeUtf8')
4141import Data.Text.Internal.Encoding.Utf8 (ord2, ord3, ord4)
4242import Data.Text.Internal.Unsafe.Char (ord)
43−import Data.Vector as Vector (Vector, empty, fromList)
43+import Data.Vector as Vector (Vector, empty, fromList, reverse)
4444import Data.Word (Word8)
4545import Foreign.ForeignPtr (withForeignPtr)
4646import Foreign.Ptr (minusPtr)
@@ -142,14 +142,14 @@ arrayValues val = do
142142 w <- A.peekWord8'
143143 if w == CLOSE_SQUARE
144144 then A.anyWord8 >> return Vector.empty
145− else Vector.fromList <$> loop
145+ else loop []
146146 where
147− loop = do
147+ loop acc = do
148148 v <- val <* skipSpace
149149 ch <- A.satisfy $ \w -> w == COMMA || w == CLOSE_SQUARE
150150 if ch == COMMA
151− then skipSpace >> (v:) <$> loop
152− else return [v]
151+ then skipSpace >> loop (v:acc)
152+ else return (Vector.reverse (Vector.fromList (v:acc)))
153153{-# INLINE arrayValues #-}
154154
155155-- | Parse any JSON value. You should usually 'json' in preference to