module Text.ParserCombinators.PArrow.Combinator where
import Control.Arrow
import Text.ParserCombinators.PArrow.MD
empty :: MD i o
empty = MEmpty
many :: MD i o -> MD i [o]
many = MStar
many1 :: MD i o -> MD i [o]
many1 x = (x &&& MStar x) >>> arr (\(b,bs) -> (b:bs))
notFollowedBy :: MD i o -> MD i o
notFollowedBy = MNot
sepBy1 :: MD i o -> MD i o' -> MD i [o]
sepBy1 p s = (many (p &&& s >>^ fst) &&& p) >>^ (\(bs,b) -> bs++[b])
count :: Int -> MD i o -> MD i [o]
count 1 prim = prim >>^ (\x -> [x])
count k p = (p &&& count (k1) p) >>^ (\(b,bs) -> (b:bs))
between :: MD i t -> MD t close -> MD t o -> MD i o
between open close real = open >>> (real &&& close) >>^ fst
optional :: MD i o -> MD i (Maybe o)
optional iarr = MChoice [iarr >>> MPure "Just" Just, MPure "const Nothing" (const Nothing)]
(>>!) :: (Arrow a) => a b c -> a b c' -> a b c
a >>! b = (a &&& b) >>^ fst