mini-1.2.2.1: Minimal essentials
Safe HaskellSafe-Inferred
LanguageHaskell2010

Mini.Transformers.ParserT

Description

Extend a monad with the ability to parse symbol sequences

Synopsis

Types

newtype ParserT s m a Source #

A transformer parsing symbols s, inner monad m, return a

Constructors

ParserT ([s] -> m (Either ParseError (a, [s]))) 

Instances

Instances details
MonadTrans (ParserT s) Source # 
Instance details

Defined in Mini.Transformers.ParserT

Methods

lift :: Monad m => m a -> ParserT s m a Source #

Monad m => MonadFail (ParserT s m) Source # 
Instance details

Defined in Mini.Transformers.ParserT

Methods

fail :: String -> ParserT s m a #

(Monad m, Eq s) => Alternative (ParserT s m) Source #

Parse p or, if p fails, backtrack and parse q via p <|> q

Instance details

Defined in Mini.Transformers.ParserT

Methods

empty :: ParserT s m a #

(<|>) :: ParserT s m a -> ParserT s m a -> ParserT s m a #

some :: ParserT s m a -> ParserT s m [a] #

many :: ParserT s m a -> ParserT s m [a] #

Monad m => Applicative (ParserT s m) Source # 
Instance details

Defined in Mini.Transformers.ParserT

Methods

pure :: a -> ParserT s m a #

(<*>) :: ParserT s m (a -> b) -> ParserT s m a -> ParserT s m b #

liftA2 :: (a -> b -> c) -> ParserT s m a -> ParserT s m b -> ParserT s m c #

(*>) :: ParserT s m a -> ParserT s m b -> ParserT s m b #

(<*) :: ParserT s m a -> ParserT s m b -> ParserT s m a #

Monad m => Functor (ParserT s m) Source # 
Instance details

Defined in Mini.Transformers.ParserT

Methods

fmap :: (a -> b) -> ParserT s m a -> ParserT s m b #

(<$) :: a -> ParserT s m b -> ParserT s m a #

Monad m => Monad (ParserT s m) Source # 
Instance details

Defined in Mini.Transformers.ParserT

Methods

(>>=) :: ParserT s m a -> (a -> ParserT s m b) -> ParserT s m b #

(>>) :: ParserT s m a -> ParserT s m b -> ParserT s m b #

return :: a -> ParserT s m a #

(Monad m, Monoid a) => Monoid (ParserT s m a) Source # 
Instance details

Defined in Mini.Transformers.ParserT

Methods

mempty :: ParserT s m a #

mappend :: ParserT s m a -> ParserT s m a -> ParserT s m a #

mconcat :: [ParserT s m a] -> ParserT s m a #

(Monad m, Semigroup a) => Semigroup (ParserT s m a) Source #

Combine the results of p and q via p <> q

Instance details

Defined in Mini.Transformers.ParserT

Methods

(<>) :: ParserT s m a -> ParserT s m a -> ParserT s m a #

sconcat :: NonEmpty (ParserT s m a) -> ParserT s m a #

stimes :: Integral b => b -> ParserT s m a -> ParserT s m a #

data ParseError Source #

Abstract representation of a parse error

Runner

runParserT :: ParserT s m a -> [s] -> m (Either ParseError (a, [s])) Source #

Unwrap a ParserT computation with a sequence of symbols to parse

Parsers

sat :: (Applicative m, Show s) => (s -> Bool) -> ParserT s m s Source #

Parse symbols satisfying a predicate

Examples

Expand
>>> runParserT (some $ sat isDigit) "123abc"
Right ("123","abc")

item :: (Applicative m, Show s) => ParserT s m s Source #

Parse any symbol

Examples

Expand
>>> runParserT (item *> item <* item) "bar"
Right ('a',"")

symbol :: (Applicative m, Show s, Eq s) => s -> ParserT s m s Source #

Parse a symbol

Examples

Expand
>>> runParserT (symbol 'f') "foo"
Right ('f',"oo")

string :: (Monad m, Traversable t, Show s, Eq s) => t s -> ParserT s m (t s) Source #

Parse a sequence of symbols

Examples

Expand
>>> runParserT (string "foo") "foobar"
Right ("foo","bar")

oneOf :: (Applicative m, Foldable t, Show s, Eq s) => t s -> ParserT s m s Source #

Parse symbols included in a collection

Examples

Expand
>>> runParserT (oneOf "abc") "bar"
Right ('b',"ar")

noneOf :: (Applicative m, Foldable t, Show s, Eq s) => t s -> ParserT s m s Source #

Parse symbols excluded from a collection

Examples

Expand
>>> runParserT (noneOf "abc") "foo"
Right ('f',"oo")

eof :: (Monad m, Show s) => ParserT s m () Source #

Parse successfully only at end of input

Examples

Expand
>>> runParserT (string "foobar" *> eof) "foobar"
Right ((),"")

Combinators

sepBy :: (Monad m, Eq s) => ParserT s m a -> ParserT s m b -> ParserT s m [a] Source #

Parse zero or more p separated by q via p `sepBy` q

Examples

Expand
>>> runParserT (sat isDigit `sepBy` symbol ',') "1,2,3,four"
Right ("123",",four")

sepBy1 :: (Monad m, Eq s) => ParserT s m a -> ParserT s m b -> ParserT s m [a] Source #

Parse one or more p separated by q via p `sepBy1` q

Examples

Expand
>>> runParserT (sat isDigit `sepBy1` symbol ',') "1,2,3,four"
Right ("123",",four")

endBy :: (Monad m, Eq s) => ParserT s m a -> ParserT s m b -> ParserT s m [a] Source #

Parse zero or more p separated and ended by q via p `endBy` q

Examples

Expand
>>> runParserT (sat isDigit `endBy` symbol ',') "1,2,3,four"
Right ("123","four")

endBy1 :: (Monad m, Eq s) => ParserT s m a -> ParserT s m b -> ParserT s m [a] Source #

Parse one or more p separated and ended by q via p `endBy1` q

Examples

Expand
>>> runParserT (sat isDigit `endBy1` symbol ',') "1,2,3,four"
Right ("123","four")

chainl :: (Monad m, Eq s) => ParserT s m a -> ParserT s m (a -> a -> a) -> a -> ParserT s m a Source #

Parse zero or more p left-chained with op atop a via chainl p op a

Examples

Expand
>>> runParserT (chainl (read <$> some (sat isDigit)) ((+) <$ item) 10) "2a3b4c"
Right (9,"c")

chainl1 :: (Monad m, Eq s) => ParserT s m a -> ParserT s m (a -> a -> a) -> ParserT s m a Source #

Parse one or more p left-chained with op via chainl1 p op

Examples

Expand
>>> runParserT (chainl1 (read <$> some (sat isDigit)) ((+) <$ item)) "2a3b4c"
Right (9,"c")

chainr :: (Monad m, Eq s) => ParserT s m a -> ParserT s m (a -> a -> a) -> a -> ParserT s m a Source #

Parse zero or more p right-chained with op atop a via chainr p op a

Examples

Expand
>>> runParserT (chainr (read <$> some (sat isDigit)) ((*) <$ item) 10) "2a3b4c"
Right (24,"c")

chainr1 :: (Monad m, Eq s) => ParserT s m a -> ParserT s m (a -> a -> a) -> ParserT s m a Source #

Parse one or more p right-chained with op via chainr1 p op

Examples

Expand
>>> runParserT (chainr1 (read <$> some (sat isDigit)) ((*) <$ item)) "2a3b4c"
Right (24,"c")

between :: Monad m => ParserT s m open -> ParserT s m close -> ParserT s m a -> ParserT s m a Source #

Parse p enclosed by a and b via between a b p

Examples

Expand
>>> runParserT (between (symbol '(') (symbol ')') (many $ sat isLetter)) "(yes)"
Right ("yes","")

option :: (Monad m, Eq s) => a -> ParserT s m a -> ParserT s m a Source #

Parse p returning a in case of failure via option a p

Examples

Expand
>>> runParserT (option "foo" $ string "bar") "baz"
Right ("foo","baz")

reject :: (Monad m, Show a) => ParserT s m a -> ParserT s m () Source #

Parse p, without consuming input, iff p fails via reject p

Examples

Expand
>>> runParserT (string "foo" <* reject (sat isLetter)) "foo(bar)"
Right ("foo","(bar)")

accept :: Monad m => ParserT s m a -> ParserT s m a Source #

Parse p, without consuming input, iff p succeeds via accept p

Examples

Expand
>>> runParserT (accept item >>= pure . (== 'a')) "foo"
Right (False,"foo")