@@ -69,6 +69,7 @@ import Control.Monad (when)
6969import Data.Attoparsec.Combinator
7070import Data.Attoparsec.FastSet (charClass, memberWord8)
7171import Data.Attoparsec.Internal.Types
72+import Data.Monoid (Monoid(..))
7273import Data.Word (Word8)
7374import Foreign.ForeignPtr (withForeignPtr)
7475import Foreign.Ptr (castPtr, minusPtr, plusPtr)
@@ -98,7 +99,7 @@ prompt :: Input -> Added -> More
9899prompt i0 a0 _m0 kf ks = Partial $ \s ->
99100 if B.null s
100101 then kf i0 a0 Complete
101− else ks (I (unI i0 +++ s)) (A (unA a0 +++ s)) Incomplete
102+ else ks (i0 `mappend` I s) (a0 `mappend` Added s) Incomplete
102103
103104-- | Immediately demand more input via a 'Partial' continuation
104105-- result.
@@ -140,6 +141,19 @@ try p = Parser $ \i0 a0 m0 kf ks ->
140141 noAdds i0 a0 m0 $ \i1 a1 m1 ->
141142 let kf' i2 a2 m2 = addS i0 a0 m0 i2 a2 m2 kf
142143 in runParser p i1 a1 m1 kf' ks
144+ where noAdds i0 _a0 m0 f = f i0 mempty m0
145+
146+addS :: Input -> Added -> More
147+ -> Input -> Added -> More
148+ -> (Input -> Added -> More -> r) -> r
149+addS i0 a0 m0 _i1 a1 m1 f =
150+ let !i = case a1 of
151+ Dropped -> i0
152+ Added s -> i0 `mappend` I s
153+ !a = a0 `mappend` a1
154+ !m = m0 `mappend` m1
155+ in f i a m
156+{-# INLINE addS #-}
143157
144158-- | The parser @satisfy p@ succeeds for any byte for which the
145159-- predicate @p@ returns 'True'. Returns the byte that is actually
@@ -441,12 +455,12 @@ successK i0 _a0 _m0 a = Done (unI i0) a
441455
442456-- | Run a parser.
443457parse :: Parser a -> B.ByteString -> Result a
444−parse m s = runParser m (I s) (A B.empty) Incomplete failK successK
458+parse m s = runParser m (I s) mempty Incomplete failK successK
445459{-# INLINE parse #-}
446460
447461-- | Run a parser that cannot be resupplied via a 'Partial' result.
448462parseOnly :: Parser a -> B.ByteString -> Either String a
449−parseOnly m s = case runParser m (I s) (A B.empty) Complete failK successK of
463+parseOnly m s = case runParser m (I s) mempty Complete failK successK of
450464 Fail _ _ err -> Left err
451465 Done _ a -> Right a
452466 _ -> error "parseOnly: impossible error!"