@@ -67,16 +67,18 @@ module Data.Attoparsec.ByteString.Internal
6767
6868import Control.Applicative ((<|>), (<$>))
6969import Control.Monad (when)
70+import Data.Attoparsec.ByteString.Buffer (Buffer, buffer)
7071import Data.Attoparsec.ByteString.FastSet (charClass, memberWord8)
7172import Data.Attoparsec.ByteString.Fhthagn (inlinePerformIO)
7273import Data.Attoparsec.Combinator ((<?>))
7374import Data.Attoparsec.Internal.Types hiding (Parser, Failure, Success)
75+import Data.ByteString (ByteString)
7476import Data.Word (Word8)
7577import Foreign.ForeignPtr (withForeignPtr)
7678import Foreign.Ptr (castPtr, minusPtr, plusPtr)
7779import Foreign.Storable (Storable(peek, sizeOf))
7880import Prelude hiding (getChar, succ, take, takeWhile)
79−import Data.ByteString (ByteString)
81+import qualified Data.Attoparsec.ByteString.Buffer as Buf
8082import qualified Data.Attoparsec.Internal.Types as T
8183import qualified Data.ByteString as B8
8284import qualified Data.ByteString.Char8 as B
@@ -84,10 +86,10 @@ import qualified Data.ByteString.Internal as B
8486import qualified Data.ByteString.Lazy as L
8587import qualified Data.ByteString.Unsafe as B
8688
87−type Parser = T.Parser B.ByteString B.ByteString
88−type Result = IResult B.ByteString B.ByteString
89−type Failure r = T.Failure B.ByteString B.ByteString r
90−type Success a r = T.Success B.ByteString B.ByteString a r
89+type Parser = T.Parser B.ByteString Buffer
90+type Result = IResult B.ByteString Buffer
91+type Failure r = T.Failure B.ByteString Buffer r
92+type Success a r = T.Success B.ByteString Buffer a r
9193
9294-- | The parser @satisfy p@ succeeds for any byte for which the
9395-- predicate @p@ returns 'True'. Returns the byte that is actually
@@ -373,13 +375,13 @@ notWord8 c = satisfy (/= c) <?> "not " ++ show c
373375peekWord8 :: Parser (Maybe Word8)
374376peekWord8 = T.Parser $ \t pos@(Pos pos_) more _lose succ ->
375377 case () of
376− _| pos_ < B.length t ->
377− let !w = B.unsafeIndex t pos_
378+ _| pos_ < Buf.length t ->
379+ let !w = Buf.unsafeIndex t pos_
378380 in succ t pos more (Just w)
379381 | more == Complete ->
380382 succ t pos more Nothing
381383 | otherwise ->
382− let succ' t' pos' more' = let !w = B.unsafeIndex t pos_
384+ let succ' t' pos' more' = let !w = Buf.unsafeIndex t pos_
383385 in succ t' pos' more' (Just w)
384386 lose' t' pos' more' = succ t' pos' more' Nothing
385387 in prompt t pos more lose' succ'
@@ -390,7 +392,7 @@ peekWord8 = T.Parser $ \t pos@(Pos pos_) more _lose succ ->
390392peekWord8' :: Parser Word8
391393peekWord8' = T.Parser $ \t pos more lose succ ->
392394 if lengthAtLeast pos 1 t
393− then succ t pos more (B.unsafeIndex t (fromPos pos))
395+ then succ t pos more (Buf.unsafeIndex t (fromPos pos))
394396 else let succ' t' pos' more' bs' = succ t' pos' more' $! B.unsafeHead bs'
395397 in ensureSuspended 1 t pos more lose succ'
396398{-# INLINE peekWord8' #-}
@@ -402,22 +404,22 @@ endOfLine = (word8 10 >> return ()) <|> (string "\r\n" >> return ())
402404
403405-- | Terminal failure continuation.
404406failK :: Failure a
405−failK t (Pos pos) _more stack msg = Fail (B.unsafeDrop pos t) stack msg
407+failK t (Pos pos) _more stack msg = Fail (Buf.unsafeDrop pos t) stack msg
406408{-# INLINE failK #-}
407409
408410-- | Terminal success continuation.
409411successK :: Success a a
410−successK t (Pos pos) _more a = Done (B.unsafeDrop pos t) a
412+successK t (Pos pos) _more a = Done (Buf.unsafeDrop pos t) a
411413{-# INLINE successK #-}
412414
413415-- | Run a parser.
414416parse :: Parser a -> B.ByteString -> Result a
415−parse m s = T.runParser m s (Pos 0) Incomplete failK successK
417+parse m s = T.runParser m (buffer s) (Pos 0) Incomplete failK successK
416418{-# INLINE parse #-}
417419
418420-- | Run a parser that cannot be resupplied via a 'Partial' result.
419421parseOnly :: Parser a -> B.ByteString -> Either String a
420−parseOnly m s = case T.runParser m s (Pos 0) Complete failK successK of
422+parseOnly m s = case T.runParser m (buffer s) (Pos 0) Complete failK successK of
421423 Fail _ _ err -> Left err
422424 Done _ a -> Right a
423425 _ -> error "parseOnly: impossible error!"
@@ -425,12 +427,12 @@ parseOnly m s = case T.runParser m s (Pos 0) Complete failK successK of
425427
426428get :: Parser ByteString
427429get = T.Parser $ \t pos more _lose succ ->
428− succ t pos more (B.unsafeDrop (fromPos pos) t)
430+ succ t pos more (Buf.unsafeDrop (fromPos pos) t)
429431{-# INLINE get #-}
430432
431433endOfChunk :: Parser Bool
432434endOfChunk = T.Parser $ \t pos more _lose succ ->
433− succ t pos more (fromPos pos == B.length t)
435+ succ t pos more (fromPos pos == Buf.length t)
434436{-# INLINE endOfChunk #-}
435437
436438advance :: Int -> Parser ()
@@ -438,7 +440,7 @@ advance n = T.Parser $ \t pos more _lose succ ->
438440 succ t (pos + Pos n) more ()
439441{-# INLINE advance #-}
440442
441−ensureSuspended :: Int -> ByteString -> Pos -> More
443+ensureSuspended :: Int -> Buffer -> Pos -> More
442444 -> Failure r
443445 -> Success ByteString r
444446 -> Result r
@@ -462,14 +464,14 @@ ensure n = T.Parser $ \t pos more lose succ ->
462464
463465-- | Ask for input. If we receive any, pass it to a success
464466-- continuation, otherwise to a failure continuation.
465−prompt :: ByteString -> Pos -> More
466− -> (ByteString -> Pos -> More -> IResult ByteString ByteString r)
467− -> (ByteString -> Pos -> More -> IResult ByteString ByteString r)
468− -> IResult ByteString ByteString r
467+prompt :: Buffer -> Pos -> More
468+ -> (Buffer -> Pos -> More -> IResult ByteString Buffer r)
469+ -> (Buffer -> Pos -> More -> IResult ByteString Buffer r)
470+ -> IResult ByteString Buffer r
469471prompt t pos _more lose succ = Partial $ \s ->
470472 if B.null s
471473 then lose t pos Complete
472− else succ (t <> s) pos Incomplete
474+ else succ (t <> buffer s) pos Incomplete
473475
474476-- | Immediately demand more input via a 'Partial' continuation
475477-- result.
@@ -519,10 +521,10 @@ atEnd :: Parser Bool
519521atEnd = not <$> wantInput
520522{-# INLINE atEnd #-}
521523
522−lengthAtLeast :: Pos -> Int -> ByteString -> Bool
523−lengthAtLeast (Pos pos) n bs = B.length bs >= pos + n
524+lengthAtLeast :: Pos -> Int -> Buffer -> Bool
525+lengthAtLeast (Pos pos) n bs = Buf.length bs >= pos + n
524526{-# INLINE lengthAtLeast #-}
525527
526−substring :: Pos -> Pos -> ByteString -> ByteString
527−substring (Pos pos) (Pos n) bs = B.unsafeTake n (B.unsafeDrop pos bs)
528+substring :: Pos -> Pos -> Buffer -> ByteString
529+substring (Pos pos) (Pos n) = Buf.substring pos n
528530{-# INLINE substring #-}