module Text.Parcom.Prim
( anyToken, oneOf, noneOf, eof
, satisfy
, token, tokens, prefix
)
where
import Text.Parcom.Core
import Text.Parcom.Internal
import Text.Parcom.Stream (toList, fromList)
import Control.Monad (liftM)
anyToken :: (Monad m, Stream s t, Token t) => ParcomT s t m t
anyToken = next
eof :: (Monad m, Stream s t, Token t) => ParcomT s t m ()
eof = notFollowedBy anyToken <?> "end of input"
oneOf :: (Monad m, Stream s t, Token t, Show t, Eq t) => [t] -> ParcomT s t m t
oneOf xs = satisfy (`elem` xs) <?> (formatOptionList . map show) xs
noneOf :: (Monad m, Stream s t, Token t, Show t, Eq t) => [t] -> ParcomT s t m t
noneOf xs = satisfy (not . (`elem` xs)) <?> "anything but " ++ (formatOptionList . map show) xs
satisfy :: (Monad m, Stream s t, Token t) => (t -> Bool) -> ParcomT s t m t
satisfy p = do
c <- peek
if p c
then next
else fail "Predicate not met"
token :: (Monad m, Stream s t, Token t, Show t, Eq t) => t -> ParcomT s t m t
token t = satisfy (== t) <?> show t
tokens :: (Monad m, Stream s t, Token t, Eq t, Show t) => [t] -> ParcomT s t m [t]
tokens [] = return []
tokens (x:xs) = do
c <- token x
cs <- tokens xs
return (c:cs)
prefix :: (Monad m, Stream s t, Token t, Eq t, Show t, Listish s t) => s -> ParcomT s t m s
prefix str = fromList `liftM` tokens (toList str)