module Text.Derp.Combinator
( (<~), (~>)
, count, between, option, optionMaybe
, many, many1, skipMany, skipMany1
, sepBy, sepBy1, endBy, endBy1, endSepBy, endSepBy1, manyTill
) where
import Text.Derp
tok s = Token s s
infixr 4 <~
infixl 4 ~>
a <~ b = a <~> b ==> fst
a ~> b = a <~> b ==> snd
count :: Ord a => Int -> Parser a -> Parser [a]
count n p | n > 0 = p <~> count (n1) p ==> uncurry (:)
| otherwise = eps []
between :: (Ord open, Ord close, Ord a) =>
Parser open -> Parser close -> Parser a -> Parser a
between open close p = open ~> (p <~ close)
option :: Ord a => a -> Parser a -> Parser a
option a p = eps a <|> p
optionMaybe :: Ord a => Parser a -> Parser (Maybe a)
optionMaybe p = eps Nothing <|> (p ==> Just)
many, many1 :: Ord a => Parser a -> Parser [a]
many p = eps [] <|> many1 p
many1 p = p <~> many p ==> uncurry (:)
skipMany, skipMany1 :: Ord a => Parser a -> Parser ()
skipMany p = eps () <|> skipMany1 p
skipMany1 p = p ~> skipMany p
sepBy, sepBy1 :: (Ord a, Ord sep) => Parser a -> Parser sep -> Parser [a]
sepBy p sep = eps [] <|> sepBy1 p sep
sepBy1 p sep = p <~> option [] (sep ~> sepBy1 p sep) ==> uncurry (:)
endBy, endBy1 :: (Ord a, Ord sep) => Parser a -> Parser sep -> Parser [a]
endBy p sep = eps [] <|> endBy1 p sep
endBy1 p sep = (p <~ sep) <~> endBy p sep ==> uncurry (:)
endSepBy, endSepBy1 :: (Ord a, Ord sep) => Parser a -> Parser sep -> Parser [a]
endSepBy p sep = eps [] <|> endSepBy1 p sep
endSepBy1 p sep = sepBy1 p sep <~ optionMaybe sep
manyTill :: (Ord a, Ord end) => Parser a -> Parser end -> Parser [a]
manyTill p end = many p <~ end