@@ -69,6 +69,7 @@ import Control.Monad (when)
69import Data.Attoparsec.Combinator
69import Data.Attoparsec.Combinator
70import Data.Attoparsec.FastSet (charClass, memberWord8)
70import Data.Attoparsec.FastSet (charClass, memberWord8)
71import Data.Attoparsec.Internal.Types
71import Data.Attoparsec.Internal.Types
72+import Data.Monoid (Monoid(..))
72import Data.Word (Word8)
73import Data.Word (Word8)
73import Foreign.ForeignPtr (withForeignPtr)
74import Foreign.ForeignPtr (withForeignPtr)
74import Foreign.Ptr (castPtr, minusPtr, plusPtr)
75import Foreign.Ptr (castPtr, minusPtr, plusPtr)
@@ -98,7 +99,7 @@ prompt :: Input -> Added -> More
98prompt i0 a0 _m0 kf ks = Partial $ \s ->
99prompt i0 a0 _m0 kf ks = Partial $ \s ->
99 if B.null s
100 if B.null s
100 then kf i0 a0 Complete
101 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
103-- | Immediately demand more input via a 'Partial' continuation
104-- | Immediately demand more input via a 'Partial' continuation
104-- result.
105-- result.
@@ -140,6 +141,19 @@ try p = Parser $ \i0 a0 m0 kf ks ->
140 noAdds i0 a0 m0 $ \i1 a1 m1 ->
141 noAdds i0 a0 m0 $ \i1 a1 m1 ->
141 let kf' i2 a2 m2 = addS i0 a0 m0 i2 a2 m2 kf
142 let kf' i2 a2 m2 = addS i0 a0 m0 i2 a2 m2 kf
142 in runParser p i1 a1 m1 kf' ks
143 in runParser p i1 a1 m1 kf' ks
144+ where noAdds i0 _a0 m0 f = f i0 mempty m0
146+addS :: Input -> Added -> More
147+ -> Input -> Added -> More
148+ -> (Input -> Added -> More -> r) -> r
149+addS i0 a0 m0 _i1 a1 m1 f =
152+ Added s -> i0 `mappend` I s
153+ !a = a0 `mappend` a1
154+ !m = m0 `mappend` m1
144-- | The parser @satisfy p@ succeeds for any byte for which the
158-- | The parser @satisfy p@ succeeds for any byte for which the
145-- predicate @p@ returns 'True'. Returns the byte that is actually
159-- predicate @p@ returns 'True'. Returns the byte that is actually
@@ -441,12 +455,12 @@ successK i0 _a0 _m0 a = Done (unI i0) a
442-- | Run a parser.
456-- | Run a parser.
443parse :: Parser a -> B.ByteString -> Result a
457parse :: 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
445{-# INLINE parse #-}
459{-# INLINE parse #-}
447-- | Run a parser that cannot be resupplied via a 'Partial' result.
461-- | Run a parser that cannot be resupplied via a 'Partial' result.
448parseOnly :: Parser a -> B.ByteString -> Either String a
462parseOnly :: 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
450 Fail _ _ err -> Left err
464 Fail _ _ err -> Left err
451 Done _ a -> Right a
465 Done _ a -> Right a
452 _ -> error "parseOnly: impossible error!"
466 _ -> error "parseOnly: impossible error!"