@@ -257,15 +257,24 @@ 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 = concatReverse `fmap` go []
260+takeWhile p = do
261+ s <- B8.takeWhile p <$> get
262+ continue <- inputSpansChunks (B.length s)
263+ if continue
264+ then takeWhileAcc p [s]
265+ else return s
266+{-# INLINE takeWhile #-}
267+
268+takeWhileAcc :: (Word8 -> Bool) -> [ByteString] -> Parser ByteString
269+takeWhileAcc p = go
261270 where
262271 go acc = do
263272 s <- B8.takeWhile p <$> get
264273 continue <- inputSpansChunks (B.length s)
265274 if continue
266275 then go (s:acc)
267− else return (s:acc)
268−{-# INLINE takeWhile #-}
276+ else return $ concatReverse (s:acc)
277+{-# INLINE takeWhileAcc #-}
269278
270279takeRest :: Parser [ByteString]
271280takeRest = go []
@@ -355,8 +364,9 @@ takeWhile1 p = do
355364 advance len
356365 eoc <- endOfChunk
357366 if eoc
358− then (s<>) `fmap` takeWhile p
367+ then takeWhileAcc p [s]
359368 else return s
369+{-# INLINE takeWhile1 #-}
360370
361371-- | Match any byte in a set.
362372--