@@ -257,7 +257,7 @@ takeTill p = takeWhile (not . p)
257257-- parsers loop until a failure occurs. Careless use will thus result
258258-- in an infinite loop.
259259takeWhile :: (Word8 -> Bool) -> Parser ByteString
260−takeWhile p = (B.concat . reverse) `fmap` go []
260+takeWhile p = concatReverse `fmap` go []
261261 where
262262 go acc = do
263263 s <- B8.takeWhile p <$> get
@@ -329,16 +329,13 @@ scan_ f s0 p = go [] s0
329329-- parsers loop until a failure occurs. Careless use will thus result
330330-- in an infinite loop.
331331scan :: s -> (s -> Word8 -> Maybe s) -> Parser ByteString
332−scan = scan_ $ \_ chunks ->
333− case chunks of
334− [x] -> return x
335− xs -> return $! B.concat $ reverse xs
332+scan = scan_ $ \_ chunks -> return $! concatReverse chunks
336333{-# INLINE scan #-}
337334
338335-- | Like 'scan', but generalized to return the final state of the
339336-- scanner.
340337runScanner :: s -> (s -> Word8 -> Maybe s) -> Parser (ByteString, s)
341−runScanner = scan_ $ \s xs -> return (B.concat (reverse xs), s)
338+runScanner = scan_ $ \s xs -> let !sx = concatReverse xs in return (sx, s)
342339{-# INLINE runScanner #-}
343340
344341-- | Consume input as long as the predicate returns 'True', and return