module ParseLib.Simple.Derived
(
module ParseLib.Simple.Core,
(<$),
(<*),
(*>),
epsilon,
symbol,
token,
pack,
sequence,
choice,
option,
optional,
many,
some, many1,
listOf,
chainr,
chainl,
greedy,
greedy1,
eof
)
where
import Prelude hiding ((>>=), (<$), (<*), (*>), (<*>), (<$>), sequence)
import ParseLib.Simple.Core
infixl 4 <$
infixl 4 <*
infixl 4 *>
(<$) :: b -> Parser s a -> Parser s b
f <$ p = const f <$> p
(<*) :: Parser s a -> Parser s b -> Parser s a
p <* q = const <$> p <*> q
(*>) :: Parser s a -> Parser s b -> Parser s b
p *> q = flip const <$> p <*> q
epsilon :: Parser s ()
epsilon = succeed ()
symbol :: Eq s => s -> Parser s s
symbol x = satisfy (==x)
token :: Eq s => [s] -> Parser s [s]
token [] = succeed []
token (x:xs) = (:) <$> symbol x <*> token xs
pack :: Parser s a -> Parser s b -> Parser s c -> Parser s b
pack p r q = p *> r <* q
sequence :: [Parser s a] -> Parser s [a]
sequence [] = succeed []
sequence (p:ps) = (:) <$> p <*> sequence ps
choice :: [Parser s a] -> Parser s a
choice = foldr (<|>) empty
option :: Parser s a -> a -> Parser s a
option p d = p <|> succeed d
optional :: Parser s a -> Parser s (Maybe a)
optional p = option (Just <$> p) Nothing
many :: Parser s a -> Parser s [a]
many p = (:) <$> p <*> many p <|> succeed []
some :: Parser s a -> Parser s [a]
some p = (:) <$> p <*> many p
many1 :: Parser s a -> Parser s [a]
many1 = some
listOf :: Parser s a -> Parser s b -> Parser s [a]
listOf p s = (:) <$> p <*> many (s *> p)
chainr :: Parser s a -> Parser s (a -> a -> a) -> Parser s a
chainr pe po = h <$> many (j <$> pe <*> po) <*> pe
where j x op = (x `op`)
h fs x = foldr ($) x fs
chainl :: Parser s a -> Parser s (a -> a -> a) -> Parser s a
chainl pe po = h <$> pe <*> many (j <$> po <*> pe)
where j op x = (`op` x)
h x fs = foldl (flip ($)) x fs
greedy :: Parser s b -> Parser s [b]
greedy p = (:) <$> p <*> greedy p <<|> succeed []
greedy1 :: Parser s b -> Parser s [b]
greedy1 p = (:) <$> p <*> greedy p
eof :: Parser s ()
eof = look >>= \ xs -> if null xs then succeed () else failp