X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Lucu.git;a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FParser.hs;h=660f550a9353cc687a56ae0e6e422ecc41a7e3f1;hp=b31d4b89be473835df40f9a1dcf72d97d526b5db;hb=19043d7;hpb=e49345ce5e6c0190c826d130d51ec42ee9f09a67 diff --git a/Network/HTTP/Lucu/Parser.hs b/Network/HTTP/Lucu/Parser.hs index b31d4b8..660f550 100644 --- a/Network/HTTP/Lucu/Parser.hs +++ b/Network/HTTP/Lucu/Parser.hs @@ -6,25 +6,52 @@ module Network.HTTP.Lucu.Parser ( atMost , finishOff + , skipManyTill + , skipWhile1 + , skipSpace1 + , isAlphaNum ) where import Control.Applicative import Control.Applicative.Unicode import Control.Monad.Unicode -import Data.Attoparsec +import Data.Attoparsec.Char8 import Prelude.Unicode -- |@'atMost' n v@ is like @'P.many' v@ but accumulates @v@ at most -- @n@ times. atMost ∷ Alternative f ⇒ Int → f α → f [α] -{-# INLINE atMost #-} +{-# INLINEABLE atMost #-} atMost 0 _ = pure [] atMost n v = ( (:) <$> v ⊛ atMost (n-1) v ) <|> pure [] --- |@'finishOff' p@ is equivalent to @p '>>=' \a -> endOfInput '>>' +-- |@'finishOff' p@ is equivalent to @p '>>=' \\a -> 'endOfInput' '>>' -- 'return' a@. finishOff ∷ Parser α → Parser α {-# INLINE finishOff #-} finishOff = ((endOfInput *>) ∘ return =≪) + +-- |Similar to 'manyTill' but discards the result. +skipManyTill ∷ Alternative f ⇒ f α → f β → f () +{-# INLINEABLE skipManyTill #-} +skipManyTill p end = go + where + go = (end *> pure ()) <|> (p *> go) + +-- |Similar to 'skipWhile' but consumes at least one character. +skipWhile1 ∷ (Char → Bool) → Parser () +{-# INLINE skipWhile1 #-} +skipWhile1 p = takeWhile1 p *> pure () + +-- |Similar to 'skipSpace' but consumes at least one whitespace. +skipSpace1 ∷ Parser () +{-# INLINE skipSpace1 #-} +skipSpace1 = skipMany1 space + +-- |@'isAlphaNum' c@ returns 'True' iff @'isDigit' c || +-- 'isAlpha_ascii' c@. +isAlphaNum ∷ Char → Bool +{-# INLINE isAlphaNum #-} +isAlphaNum c = isDigit c ∨ isAlpha_ascii c