module Text.ParserCombinators.Parsec.Combinator
( between
, chainl
, chainl1
, chainr
, chainr1
, choice
, count
, endBy
, endBy1
, eof
, many1
, notFollowedBy
, option
, optionMaybe
, optional
, sepBy
, sepBy1
, sepEndBy
, sepEndBy1
, skipMany1
, anyToken
, lookAhead
, manyTill
) where
import Control.Monad
import Text.ParserCombinators.Parsec.Prim
choice :: [GenParser tok st a] -> GenParser tok st a
choice :: [GenParser tok st a] -> GenParser tok st a
choice = (GenParser tok st a -> GenParser tok st a -> GenParser tok st a)
-> GenParser tok st a -> [GenParser tok st a] -> GenParser tok st a
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr GenParser tok st a -> GenParser tok st a -> GenParser tok st a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>) GenParser tok st a
forall (m :: * -> *) a. MonadPlus m => m a
mzero
option :: a -> GenParser tok st a -> GenParser tok st a
option :: a -> GenParser tok st a -> GenParser tok st a
option a
x GenParser tok st a
p = GenParser tok st a
p GenParser tok st a -> GenParser tok st a -> GenParser tok st a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> a -> GenParser tok st a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
optionMaybe :: GenParser tok st a -> GenParser tok st (Maybe a)
optionMaybe :: GenParser tok st a -> GenParser tok st (Maybe a)
optionMaybe GenParser tok st a
p = Maybe a -> GenParser tok st (Maybe a) -> GenParser tok st (Maybe a)
forall a tok st. a -> GenParser tok st a -> GenParser tok st a
option Maybe a
forall a. Maybe a
Nothing ((a -> Maybe a) -> GenParser tok st a -> GenParser tok st (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Maybe a
forall a. a -> Maybe a
Just GenParser tok st a
p)
optional :: GenParser tok st a -> GenParser tok st ()
optional :: GenParser tok st a -> GenParser tok st ()
optional GenParser tok st a
p = () () -> GenParser tok st a -> GenParser tok st ()
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ GenParser tok st a
p GenParser tok st () -> GenParser tok st () -> GenParser tok st ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> () -> GenParser tok st ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
between :: GenParser tok st open -> GenParser tok st close
-> GenParser tok st a -> GenParser tok st a
between :: GenParser tok st open
-> GenParser tok st close
-> GenParser tok st a
-> GenParser tok st a
between GenParser tok st open
open GenParser tok st close
close GenParser tok st a
p = GenParser tok st open
open GenParser tok st open -> GenParser tok st a -> GenParser tok st a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> GenParser tok st a
p GenParser tok st a -> GenParser tok st close -> GenParser tok st a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* GenParser tok st close
close
skipMany1 :: GenParser tok st a -> GenParser tok st ()
skipMany1 :: GenParser tok st a -> GenParser tok st ()
skipMany1 GenParser tok st a
p = GenParser tok st a
p GenParser tok st a -> GenParser tok st () -> GenParser tok st ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> GenParser tok st a -> GenParser tok st ()
forall tok st a. GenParser tok st a -> GenParser tok st ()
skipMany GenParser tok st a
p
many1 :: GenParser tok st a -> GenParser tok st [a]
many1 :: GenParser tok st a -> GenParser tok st [a]
many1 GenParser tok st a
p = do
a
x <- GenParser tok st a
p
[a]
xs <- GenParser tok st a -> GenParser tok st [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many GenParser tok st a
p
[a] -> GenParser tok st [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
xs)
sepBy :: GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
sepBy :: GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
sepBy GenParser tok st a
p GenParser tok st sep
sep = GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
forall tok st a sep.
GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
sepBy1 GenParser tok st a
p GenParser tok st sep
sep GenParser tok st [a]
-> GenParser tok st [a] -> GenParser tok st [a]
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> [a] -> GenParser tok st [a]
forall (m :: * -> *) a. Monad m => a -> m a
return []
sepBy1 :: GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
sepBy1 :: GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
sepBy1 GenParser tok st a
p GenParser tok st sep
sep = do
a
x <- GenParser tok st a
p
[a]
xs <- GenParser tok st a -> GenParser tok st [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (GenParser tok st sep
sep GenParser tok st sep -> GenParser tok st a -> GenParser tok st a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> GenParser tok st a
p)
[a] -> GenParser tok st [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
xs)
sepEndBy1 :: GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
sepEndBy1 :: GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
sepEndBy1 GenParser tok st a
p GenParser tok st sep
sep = do
a
x <- GenParser tok st a
p
do
[a]
xs <- GenParser tok st sep
sep GenParser tok st sep
-> GenParser tok st [a] -> GenParser tok st [a]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
forall tok st a sep.
GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
sepEndBy GenParser tok st a
p GenParser tok st sep
sep
[a] -> GenParser tok st [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
xs)
GenParser tok st [a]
-> GenParser tok st [a] -> GenParser tok st [a]
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> [a] -> GenParser tok st [a]
forall (m :: * -> *) a. Monad m => a -> m a
return [a
x]
sepEndBy :: GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
sepEndBy :: GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
sepEndBy GenParser tok st a
p GenParser tok st sep
sep = GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
forall tok st a sep.
GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
sepEndBy1 GenParser tok st a
p GenParser tok st sep
sep GenParser tok st [a]
-> GenParser tok st [a] -> GenParser tok st [a]
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> [a] -> GenParser tok st [a]
forall (m :: * -> *) a. Monad m => a -> m a
return []
endBy1 :: GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
endBy1 :: GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
endBy1 GenParser tok st a
p GenParser tok st sep
sep = GenParser tok st a -> GenParser tok st [a]
forall tok st a. GenParser tok st a -> GenParser tok st [a]
many1 (GenParser tok st a
p GenParser tok st a -> GenParser tok st sep -> GenParser tok st a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* GenParser tok st sep
sep)
endBy :: GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
endBy :: GenParser tok st a -> GenParser tok st sep -> GenParser tok st [a]
endBy GenParser tok st a
p GenParser tok st sep
sep = GenParser tok st a -> GenParser tok st [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (GenParser tok st a
p GenParser tok st a -> GenParser tok st sep -> GenParser tok st a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* GenParser tok st sep
sep)
count :: Int -> GenParser tok st a -> GenParser tok st [a]
count :: Int -> GenParser tok st a -> GenParser tok st [a]
count Int
n GenParser tok st a
p | Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = [a] -> GenParser tok st [a]
forall (m :: * -> *) a. Monad m => a -> m a
return []
| Bool
otherwise = Int -> GenParser tok st a -> GenParser tok st [a]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
n GenParser tok st a
p
chainr :: GenParser tok st a -> GenParser tok st (a -> a -> a) -> a
-> GenParser tok st a
chainr :: GenParser tok st a
-> GenParser tok st (a -> a -> a) -> a -> GenParser tok st a
chainr GenParser tok st a
p GenParser tok st (a -> a -> a)
op a
x = GenParser tok st a
-> GenParser tok st (a -> a -> a) -> GenParser tok st a
forall tok st a.
GenParser tok st a
-> GenParser tok st (a -> a -> a) -> GenParser tok st a
chainr1 GenParser tok st a
p GenParser tok st (a -> a -> a)
op GenParser tok st a -> GenParser tok st a -> GenParser tok st a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> a -> GenParser tok st a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
chainl :: GenParser tok st a -> GenParser tok st (a -> a -> a) -> a
-> GenParser tok st a
chainl :: GenParser tok st a
-> GenParser tok st (a -> a -> a) -> a -> GenParser tok st a
chainl GenParser tok st a
p GenParser tok st (a -> a -> a)
op a
x = GenParser tok st a
-> GenParser tok st (a -> a -> a) -> GenParser tok st a
forall tok st a.
GenParser tok st a
-> GenParser tok st (a -> a -> a) -> GenParser tok st a
chainl1 GenParser tok st a
p GenParser tok st (a -> a -> a)
op GenParser tok st a -> GenParser tok st a -> GenParser tok st a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> a -> GenParser tok st a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
chainl1 :: GenParser tok st a -> GenParser tok st (a -> a -> a)
-> GenParser tok st a
chainl1 :: GenParser tok st a
-> GenParser tok st (a -> a -> a) -> GenParser tok st a
chainl1 GenParser tok st a
p GenParser tok st (a -> a -> a)
op = do
a
x <- GenParser tok st a
p
a -> GenParser tok st a
rest a
x
where
rest :: a -> GenParser tok st a
rest a
x = do
a -> a -> a
f <- GenParser tok st (a -> a -> a)
op
a
y <- GenParser tok st a
p
a -> GenParser tok st a
rest (a -> a -> a
f a
x a
y)
GenParser tok st a -> GenParser tok st a -> GenParser tok st a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> a -> GenParser tok st a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
chainr1 :: GenParser tok st a -> GenParser tok st (a -> a -> a)
-> GenParser tok st a
chainr1 :: GenParser tok st a
-> GenParser tok st (a -> a -> a) -> GenParser tok st a
chainr1 GenParser tok st a
p GenParser tok st (a -> a -> a)
op = GenParser tok st a
scan
where
scan :: GenParser tok st a
scan = do
a
x <- GenParser tok st a
p
a -> GenParser tok st a
rest a
x
rest :: a -> GenParser tok st a
rest a
x = do
a -> a -> a
f <- GenParser tok st (a -> a -> a)
op
a -> a -> a
f a
x (a -> a) -> GenParser tok st a -> GenParser tok st a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenParser tok st a
scan
GenParser tok st a -> GenParser tok st a -> GenParser tok st a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> a -> GenParser tok st a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
anyToken :: Show tok => GenParser tok st tok
anyToken :: GenParser tok st tok
anyToken = (tok -> String)
-> (SourcePos -> tok -> [tok] -> SourcePos)
-> (tok -> Maybe tok)
-> GenParser tok st tok
forall tok a st.
(tok -> String)
-> (SourcePos -> tok -> [tok] -> SourcePos)
-> (tok -> Maybe a)
-> GenParser tok st a
tokenPrim tok -> String
forall a. Show a => a -> String
show (\ SourcePos
pos tok
_tok [tok]
_toks -> SourcePos
pos) tok -> Maybe tok
forall a. a -> Maybe a
Just
eof :: Show tok => GenParser tok st ()
eof :: GenParser tok st ()
eof = GenParser tok st tok -> GenParser tok st ()
forall a tok st.
Show a =>
GenParser tok st a -> GenParser tok st ()
notFollowedBy GenParser tok st tok
forall tok st. Show tok => GenParser tok st tok
anyToken GenParser tok st () -> String -> GenParser tok st ()
forall tok st a. GenParser tok st a -> String -> GenParser tok st a
<?> String
"end of input"
notFollowedBy :: Show a => GenParser tok st a -> GenParser tok st ()
notFollowedBy :: GenParser tok st a -> GenParser tok st ()
notFollowedBy GenParser tok st a
p = GenParser tok st () -> GenParser tok st ()
forall tok st a. GenParser tok st a -> GenParser tok st a
try (GenParser tok st () -> GenParser tok st ())
-> GenParser tok st () -> GenParser tok st ()
forall a b. (a -> b) -> a -> b
$ do
a
c <- GenParser tok st a
p
String -> GenParser tok st ()
forall tok st a. String -> GenParser tok st a
unexpected (a -> String
forall a. Show a => a -> String
show a
c)
GenParser tok st () -> GenParser tok st () -> GenParser tok st ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> () -> GenParser tok st ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
manyTill :: GenParser tok st a -> GenParser tok st end -> GenParser tok st [a]
manyTill :: GenParser tok st a -> GenParser tok st end -> GenParser tok st [a]
manyTill GenParser tok st a
p GenParser tok st end
end = GenParser tok st [a]
scan where
scan :: GenParser tok st [a]
scan = [] [a] -> GenParser tok st end -> GenParser tok st [a]
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ GenParser tok st end
end GenParser tok st [a]
-> GenParser tok st [a] -> GenParser tok st [a]
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> do
a
x <- GenParser tok st a
p
[a]
xs <- GenParser tok st [a]
scan
[a] -> GenParser tok st [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
xs)