git.iko.soy/typeable/attoparsec
on master help sign in
Implement inputSpansChunks for Text
commitabecf988013e44cfff2f22f70e1ff7e8442364db authorBryan O'Sullivan <bos@serpentine.com> dateFri 30 May 2014, 18:34 (12 years ago) parentd46b0c4
1 file changed+17−16
Data/Attoparsec/Text/Internal.hs+17−16
Data/Attoparsec/Text/Internal.hs+17−16
@@ -206,11 +206,8 @@ skipWhile p = go
206206 where
207207 go = do
208208 t <- T.takeWhile p <$> get
209− advance (length t)
210− eoc <- endOfChunk
211− when eoc $ do
212− input <- wantInput
213− when input go
209+ continue <- inputSpansChunks (length t)
210+ when continue go
214211{-# INLINE skipWhile #-}
215212
216213-- | Consume input as long as the predicate returns 'False'
@@ -242,14 +239,9 @@ takeWhile p = (T.concat . reverse) `fmap` go []
242239 where
243240 go acc = do
244241 h <- T.takeWhile p <$> get
245− advance (length h)
246− eoc <- endOfChunk
247− if eoc
248− then do
249− input <- wantInput
250− if input
251− then go (h:acc)
252− else return (h:acc)
242+ continue <- inputSpansChunks (length h)
243+ if continue
244+ then go (h:acc)
253245 else return (h:acc)
254246
255247takeRest :: Parser [Text]
@@ -287,9 +279,8 @@ scan_ f s0 p = go [] s0
287279 go acc s = do
288280 input <- get
289281 case scanner s 0 input of
290− Continue s' -> do advance (length input)
291− more <- wantInput
292− if more
282+ Continue s' -> do continue <- inputSpansChunks (length input)
283+ if continue
293284 then go (input : acc) s'
294285 else f s' (input : acc)
295286 Finished n t -> do advance (length input - length t)
@@ -452,6 +443,16 @@ endOfChunk = T.Parser $ \t pos more _lose succ ->
452443 succ t pos more (pos == lengthOf t)
453444{-# INLINE endOfChunk #-}
454445
446+inputSpansChunks :: Pos -> Parser Bool
447+inputSpansChunks i = T.Parser $ \t pos_ more _lose succ ->
448+ let pos = pos_ + i
449+ in if pos < lengthOf t || more == Complete
450+ then succ t pos more False
451+ else let lose' t' pos' more' = succ t' pos' more' False
452+ succ' t' pos' more' = succ t' pos' more' True
453+ in prompt t pos more lose' succ'
454+{-# INLINE inputSpansChunks #-}
455+
455456advance :: Pos -> Parser ()
456457advance n = T.Parser $ \t pos more _lose succ -> succ t (pos+n) more ()
457458{-# INLINE advance #-}