{-# LANGUAGE RankNTypes, 
 GADTs,
 MultiParamTypeClasses,
 FunctionalDependencies, 
 FlexibleInstances, 
 FlexibleContexts, 
 UndecidableInstances,
 NoMonomorphismRestriction #-}-- | This module contains a large variety of combinators for list-like structures. the extension @_ng@ indicates that -- that variant is the non-greedy variant.-- See the "Text.ParserCombinators.UU.Demo.Examples" module for some examples of their use.moduleText.ParserCombinators.UU.DerivedwhereimportText.ParserCombinators.UU.Core -- * Some aliases for oft occurring constructs-- | @`pReturn`@ is defined for upwards compatibility--pReturn ::Applicativep =>a ->p a pReturn :: a -> p a
pReturn =a -> p a
forall (f :: * -> *) a. Applicative f => a -> f a
pure-- | @`pFail`@ is defined for upwards compatibility, and is the unit for @<|>@--pFail ::Alternativep =>p a pFail :: p a
pFail =p a
forall (f :: * -> *) a. Alternative f => f a
empty-- | `pMaybe` greedily recognises its argument. If not @Nothing@ is returned.--pMaybe ::IsParser p =>p a ->p (Maybea )pMaybe :: p a -> p (Maybe a)
pMaybe p a
p =String -> p a -> p (Maybe a) -> p (Maybe a)
forall (p :: * -> *) a c.
ExtAlternative p =>
String -> p a -> c -> c
must_be_non_empty String
"pMaybe"p a
p (a -> Maybe a
forall a. a -> Maybe a
Just(a -> Maybe a) -> p a -> p (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p a
p p (Maybe a) -> Maybe a -> p (Maybe a)
forall (p :: * -> *) a. ExtAlternative p => p a -> a -> p a
`opt` Maybe a
forall a. Maybe a
Nothing)-- | `pEither` recognises either one of its arguments.--pEither ::IsParser p =>p a ->p b ->p (Eithera b )pEither :: p a -> p b -> p (Either a b)
pEither p a
p p b
q =a -> Either a b
forall a b. a -> Either a b
Left(a -> Either a b) -> p a -> p (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p a
p p (Either a b) -> p (Either a b) -> p (Either a b)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>b -> Either a b
forall a b. b -> Either a b
Right(b -> Either a b) -> p b -> p (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p b
q -- | `<$$>` is the version of `<$>` which flips the function argument --(<$$>) ::IsParser p =>(a ->b ->c )->p b ->p (a ->c )a -> b -> c
f <$$> :: (a -> b -> c) -> p b -> p (a -> c)
<$$> p b
p =(a -> b -> c) -> b -> a -> c
forall a b c. (a -> b -> c) -> b -> a -> c
flipa -> b -> c
f (b -> a -> c) -> p b -> p (a -> c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p b
p -- | `<??>` parses an optional postfix element and applies its result to its left hand result--(<??>) ::IsParser p =>p a ->p (a ->a )->p a p a
p <??> :: p a -> p (a -> a) -> p a
<??> p (a -> a)
q =String -> p (a -> a) -> p a -> p a
forall (p :: * -> *) a c.
ExtAlternative p =>
String -> p a -> c -> c
must_be_non_empty String
"<??>"p (a -> a)
q (p a
p p a -> p (a -> a) -> p a
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**>(p (a -> a)
q p (a -> a) -> (a -> a) -> p (a -> a)
forall (p :: * -> *) a. ExtAlternative p => p a -> a -> p a
`opt` a -> a
forall a. a -> a
id))-- | `<.>` functional composition of two parsers--(<.>) ::IsParser p =>p (b ->c )->p (a ->b )->p (a ->c )p (b -> c)
f <.> :: p (b -> c) -> p (a -> b) -> p (a -> c)
<.> p (a -> b)
g =(b -> c) -> (a -> b) -> a -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.)((b -> c) -> (a -> b) -> a -> c)
-> p (b -> c) -> p ((a -> b) -> a -> c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p (b -> c)
f p ((a -> b) -> a -> c) -> p (a -> b) -> p (a -> c)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>p (a -> b)
g -- | `<..>` functional composition of two parsers with the arguments reversed--(<..>) ::IsParser p =>p (a ->b )->p (b ->c )->p (a ->c )p (a -> b)
g <..> :: p (a -> b) -> p (b -> c) -> p (a -> c)
<..> p (b -> c)
f =(b -> c) -> (a -> b) -> a -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.)((b -> c) -> (a -> b) -> a -> c)
-> p (b -> c) -> p ((a -> b) -> a -> c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p (b -> c)
f p ((a -> b) -> a -> c) -> p (a -> b) -> p (a -> c)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>p (a -> b)
g infixl4<??> -- | `pMany` is equivalent to the `many` from "Control.Applicative". We want however all our parsers to start with a lower case @p@.pMany ::IsParser p =>p a ->p [a ]pMany :: p a -> p [a]
pMany p a
p =p a -> p [a]
forall (p :: * -> *) a. IsParser p => p a -> p [a]
pList p a
p -- | `pSome` is equivalent to the `some` from "Control.Applicative". We want however all our parsers to start with a lower case @p@.pSome ::(IsParser f )=>f a ->f [a ]pSome :: f a -> f [a]
pSome f a
p =(:)(a -> [a] -> [a]) -> f a -> f ([a] -> [a])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>f a
p f ([a] -> [a]) -> f [a] -> f [a]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>f a -> f [a]
forall (p :: * -> *) a. IsParser p => p a -> p [a]
pList f a
p -- | @`pPacked`@ surrounds its third parser with the first and the second one, returning only the middle resultpPacked ::IsParser p =>p b1 ->p b2 ->p a ->p a pPacked :: p b1 -> p b2 -> p a -> p a
pPacked p b1
l p b2
r p a
x =p b1
l p b1 -> p a -> p a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*>p a
x p a -> p b2 -> p a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<*p b2
r -- * Iterating combinators, all in a greedy (default) and a non-greedy (ending with @_ng@) variant-- ** Recognising list like structurespFoldr ::IsParser p =>(a ->a1 ->a1 ,a1 )->p a ->p a1 pFoldr :: (a -> a1 -> a1, a1) -> p a -> p a1
pFoldr alg :: (a -> a1 -> a1, a1)
alg @(a -> a1 -> a1
op ,a1
e )p a
p =String -> p a -> p a1 -> p a1
forall (p :: * -> *) a c.
ExtAlternative p =>
String -> p a -> c -> c
must_be_non_empty String
"pFoldr"p a
p p a1
pfm wherepfm :: p a1
pfm =(a -> a1 -> a1
op (a -> a1 -> a1) -> p a -> p (a1 -> a1)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p a
p p (a1 -> a1) -> p a1 -> p a1
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>p a1
pfm )p a1 -> a1 -> p a1
forall (p :: * -> *) a. ExtAlternative p => p a -> a -> p a
`opt` a1
e pFoldr_ng ::IsParser p =>(a ->a1 ->a1 ,a1 )->p a ->p a1 pFoldr_ng :: (a -> a1 -> a1, a1) -> p a -> p a1
pFoldr_ng alg :: (a -> a1 -> a1, a1)
alg @(a -> a1 -> a1
op ,a1
e )p a
p =String -> p a -> p a1 -> p a1
forall (p :: * -> *) a c.
ExtAlternative p =>
String -> p a -> c -> c
must_be_non_empty String
"pFoldr_ng"p a
p p a1
pfm wherepfm :: p a1
pfm =(a -> a1 -> a1
op (a -> a1 -> a1) -> p a -> p (a1 -> a1)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p a
p p (a1 -> a1) -> p a1 -> p a1
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>p a1
pfm )p a1 -> p a1 -> p a1
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>a1 -> p a1
forall (f :: * -> *) a. Applicative f => a -> f a
purea1
e pFoldr1 ::IsParser p =>(v ->b ->b ,b )->p v ->p b pFoldr1 :: (v -> b -> b, b) -> p v -> p b
pFoldr1 alg :: (v -> b -> b, b)
alg @(v -> b -> b
op ,b
e )p v
p =String -> p v -> p b -> p b
forall (p :: * -> *) a c.
ExtAlternative p =>
String -> p a -> c -> c
must_be_non_empty String
"pFoldr1"p v
p (v -> b -> b
op (v -> b -> b) -> p v -> p (b -> b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p v
p p (b -> b) -> p b -> p b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>(v -> b -> b, b) -> p v -> p b
forall (p :: * -> *) a a1.
IsParser p =>
(a -> a1 -> a1, a1) -> p a -> p a1
pFoldr (v -> b -> b, b)
alg p v
p )pFoldr1_ng ::IsParser p =>(v ->b ->b ,b )->p v ->p b pFoldr1_ng :: (v -> b -> b, b) -> p v -> p b
pFoldr1_ng alg :: (v -> b -> b, b)
alg @(v -> b -> b
op ,b
e )p v
p =String -> p v -> p b -> p b
forall (p :: * -> *) a c.
ExtAlternative p =>
String -> p a -> c -> c
must_be_non_empty String
"pFoldr1_ng"p v
p (v -> b -> b
op (v -> b -> b) -> p v -> p (b -> b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p v
p p (b -> b) -> p b -> p b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>(v -> b -> b, b) -> p v -> p b
forall (p :: * -> *) a a1.
IsParser p =>
(a -> a1 -> a1, a1) -> p a -> p a1
pFoldr_ng (v -> b -> b, b)
alg p v
p )list_alg ::(a ->[a ]->[a ],[a1 ])list_alg :: (a -> [a] -> [a], [a1])
list_alg =((:),[])pList ::IsParser p =>p a ->p [a ]pList :: p a -> p [a]
pList p a
p =String -> p a -> p [a] -> p [a]
forall (p :: * -> *) a c.
ExtAlternative p =>
String -> p a -> c -> c
must_be_non_empty String
"pList"p a
p ((a -> [a] -> [a], [a]) -> p a -> p [a]
forall (p :: * -> *) a a1.
IsParser p =>
(a -> a1 -> a1, a1) -> p a -> p a1
pFoldr (a -> [a] -> [a], [a])
forall a a1. (a -> [a] -> [a], [a1])
list_alg p a
p )pList_ng ::IsParser p =>p a ->p [a ]pList_ng :: p a -> p [a]
pList_ng p a
p =String -> p a -> p [a] -> p [a]
forall (p :: * -> *) a c.
ExtAlternative p =>
String -> p a -> c -> c
must_be_non_empty String
"pList_ng"p a
p ((a -> [a] -> [a], [a]) -> p a -> p [a]
forall (p :: * -> *) a a1.
IsParser p =>
(a -> a1 -> a1, a1) -> p a -> p a1
pFoldr_ng (a -> [a] -> [a], [a])
forall a a1. (a -> [a] -> [a], [a1])
list_alg p a
p )pList1 ::IsParser p =>p a ->p [a ]pList1 :: p a -> p [a]
pList1 p a
p =String -> p a -> p [a] -> p [a]
forall (p :: * -> *) a c.
ExtAlternative p =>
String -> p a -> c -> c
must_be_non_empty String
"pList"p a
p ((a -> [a] -> [a], [a]) -> p a -> p [a]
forall (p :: * -> *) a a1.
IsParser p =>
(a -> a1 -> a1, a1) -> p a -> p a1
pFoldr1 (a -> [a] -> [a], [a])
forall a a1. (a -> [a] -> [a], [a1])
list_alg p a
p )pList1_ng ::IsParser p =>p a ->p [a ]pList1_ng :: p a -> p [a]
pList1_ng p a
p =String -> p a -> p [a] -> p [a]
forall (p :: * -> *) a c.
ExtAlternative p =>
String -> p a -> c -> c
must_be_non_empty String
"pList_ng"p a
p ((a -> [a] -> [a], [a]) -> p a -> p [a]
forall (p :: * -> *) a a1.
IsParser p =>
(a -> a1 -> a1, a1) -> p a -> p a1
pFoldr1_ng (a -> [a] -> [a], [a])
forall a a1. (a -> [a] -> [a], [a1])
list_alg p a
p )-- * Recognising list structures with separatorspFoldrSep ::IsParser p =>(v ->b ->b ,b )->p a ->p v ->p b pFoldrSep :: (v -> b -> b, b) -> p a -> p v -> p b
pFoldrSep alg :: (v -> b -> b, b)
alg @(v -> b -> b
op ,b
e )p a
sep p v
p =String -> p a -> p v -> p b -> p b
forall (p :: * -> *) a b c.
ExtAlternative p =>
String -> p a -> p b -> c -> c
must_be_non_empties String
"pFoldrSep"p a
sep p v
p (v -> b -> b
op (v -> b -> b) -> p v -> p (b -> b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p v
p p (b -> b) -> p b -> p b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>(v -> b -> b, b) -> p v -> p b
forall (p :: * -> *) a a1.
IsParser p =>
(a -> a1 -> a1, a1) -> p a -> p a1
pFoldr (v -> b -> b, b)
alg p v
sepp p b -> b -> p b
forall (p :: * -> *) a. ExtAlternative p => p a -> a -> p a
`opt` b
e )wheresepp :: p v
sepp =p a
sep p a -> p v -> p v
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*>p v
p pFoldrSep_ng ::IsParser p =>(v ->b ->b ,b )->p a ->p v ->p b pFoldrSep_ng :: (v -> b -> b, b) -> p a -> p v -> p b
pFoldrSep_ng alg :: (v -> b -> b, b)
alg @(v -> b -> b
op ,b
e )p a
sep p v
p =String -> p a -> p v -> p b -> p b
forall (p :: * -> *) a b c.
ExtAlternative p =>
String -> p a -> p b -> c -> c
must_be_non_empties String
"pFoldrSep"p a
sep p v
p (v -> b -> b
op (v -> b -> b) -> p v -> p (b -> b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p v
p p (b -> b) -> p b -> p b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>(v -> b -> b, b) -> p v -> p b
forall (p :: * -> *) a a1.
IsParser p =>
(a -> a1 -> a1, a1) -> p a -> p a1
pFoldr_ng (v -> b -> b, b)
alg p v
sepp p b -> p b -> p b
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>b -> p b
forall (f :: * -> *) a. Applicative f => a -> f a
pureb
e )wheresepp :: p v
sepp =p a
sep p a -> p v -> p v
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*>p v
p pFoldr1Sep ::IsParser p =>(a ->b ->b ,b )->p a1 ->p a ->p b pFoldr1Sep :: (a -> b -> b, b) -> p a1 -> p a -> p b
pFoldr1Sep alg :: (a -> b -> b, b)
alg @(a -> b -> b
op ,b
e )p a1
sep p a
p =String -> p a1 -> p a -> p b -> p b
forall (p :: * -> *) a b c.
ExtAlternative p =>
String -> p a -> p b -> c -> c
must_be_non_empties String
"pFoldr1Sep"p a1
sep p a
p p b
pfm wherepfm :: p b
pfm =a -> b -> b
op (a -> b -> b) -> p a -> p (b -> b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p a
p p (b -> b) -> p b -> p b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>(a -> b -> b, b) -> p a -> p b
forall (p :: * -> *) a a1.
IsParser p =>
(a -> a1 -> a1, a1) -> p a -> p a1
pFoldr (a -> b -> b, b)
alg (p a1
sep p a1 -> p a -> p a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*>p a
p )pFoldr1Sep_ng ::IsParser p =>(a ->b ->b ,b )->p a1 ->p a ->p b pFoldr1Sep_ng :: (a -> b -> b, b) -> p a1 -> p a -> p b
pFoldr1Sep_ng alg :: (a -> b -> b, b)
alg @(a -> b -> b
op ,b
e )p a1
sep p a
p =String -> p a1 -> p a -> p b -> p b
forall (p :: * -> *) a b c.
ExtAlternative p =>
String -> p a -> p b -> c -> c
must_be_non_empties String
"pFoldr1Sep_ng"p a1
sep p a
p p b
pfm wherepfm :: p b
pfm =a -> b -> b
op (a -> b -> b) -> p a -> p (b -> b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p a
p p (b -> b) -> p b -> p b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>(a -> b -> b, b) -> p a -> p b
forall (p :: * -> *) a a1.
IsParser p =>
(a -> a1 -> a1, a1) -> p a -> p a1
pFoldr_ng (a -> b -> b, b)
alg (p a1
sep p a1 -> p a -> p a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*>p a
p )pListSep ::IsParser p =>p a1 ->p a ->p [a ]pListSep :: p a1 -> p a -> p [a]
pListSep p a1
sep p a
p =String -> p a1 -> p a -> p [a] -> p [a]
forall (p :: * -> *) a b c.
ExtAlternative p =>
String -> p a -> p b -> c -> c
must_be_non_empties String
"pListSep"p a1
sep p a
p ((a -> [a] -> [a], [a]) -> p a1 -> p a -> p [a]
forall (p :: * -> *) v b a.
IsParser p =>
(v -> b -> b, b) -> p a -> p v -> p b
pFoldrSep (a -> [a] -> [a], [a])
forall a a1. (a -> [a] -> [a], [a1])
list_alg p a1
sep p a
p )pListSep_ng ::IsParser p =>p a1 ->p a ->p [a ]pListSep_ng :: p a1 -> p a -> p [a]
pListSep_ng p a1
sep p a
p =String
-> p a1
-> p a
-> ((a -> [a] -> [a], [a]) -> p a1 -> p a -> p [a])
-> (a -> [a] -> [a], [a])
-> p a1
-> p a
-> p [a]
forall (p :: * -> *) a b c.
ExtAlternative p =>
String -> p a -> p b -> c -> c
must_be_non_empties String
"pListSep_ng"p a1
sep p a
p (a -> [a] -> [a], [a]) -> p a1 -> p a -> p [a]
forall (p :: * -> *) v b a.
IsParser p =>
(v -> b -> b, b) -> p a -> p v -> p b
pFoldrSep_ng (a -> [a] -> [a], [a])
forall a a1. (a -> [a] -> [a], [a1])
list_alg p a1
sep p a
p pList1Sep ::IsParser p =>p a1 ->p a ->p [a ]pList1Sep :: p a1 -> p a -> p [a]
pList1Sep p a1
s p a
p =String -> p a1 -> p a -> p [a] -> p [a]
forall (p :: * -> *) a b c.
ExtAlternative p =>
String -> p a -> p b -> c -> c
must_be_non_empties String
"pListSep"p a1
s p a
p ((a -> [a] -> [a], [a]) -> p a1 -> p a -> p [a]
forall (p :: * -> *) v b a.
IsParser p =>
(v -> b -> b, b) -> p a -> p v -> p b
pFoldr1Sep (a -> [a] -> [a], [a])
forall a a1. (a -> [a] -> [a], [a1])
list_alg p a1
s p a
p )pList1Sep_ng ::IsParser p =>p a1 ->p a ->p [a ]pList1Sep_ng :: p a1 -> p a -> p [a]
pList1Sep_ng p a1
s p a
p =String -> p a1 -> p a -> p [a] -> p [a]
forall (p :: * -> *) a b c.
ExtAlternative p =>
String -> p a -> p b -> c -> c
must_be_non_empties String
"pListSep_ng"p a1
s p a
p ((a -> [a] -> [a], [a]) -> p a1 -> p a -> p [a]
forall (p :: * -> *) v b a.
IsParser p =>
(v -> b -> b, b) -> p a -> p v -> p b
pFoldr1Sep_ng (a -> [a] -> [a], [a])
forall a a1. (a -> [a] -> [a], [a1])
list_alg p a1
s p a
p )-- * Combinators for chained structures-- ** Treating the operator as right associativepChainr ::IsParser p =>p (c ->c ->c )->p c ->p c pChainr :: p (c -> c -> c) -> p c -> p c
pChainr p (c -> c -> c)
op p c
x =String -> p (c -> c -> c) -> p c -> p c -> p c
forall (p :: * -> *) a b c.
ExtAlternative p =>
String -> p a -> p b -> c -> c
must_be_non_empties String
"pChainr"p (c -> c -> c)
op p c
x p c
r wherer :: p c
r =p c
x p c -> p (c -> c) -> p c
forall (p :: * -> *) a. IsParser p => p a -> p (a -> a) -> p a
<??> ((c -> c -> c) -> c -> c -> c
forall a b c. (a -> b -> c) -> b -> a -> c
flip((c -> c -> c) -> c -> c -> c)
-> p (c -> c -> c) -> p (c -> c -> c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p (c -> c -> c)
op p (c -> c -> c) -> p c -> p (c -> c)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>p c
r )pChainr_ng ::IsParser p =>p (c ->c ->c )->p c ->p c pChainr_ng :: p (c -> c -> c) -> p c -> p c
pChainr_ng p (c -> c -> c)
op p c
x =String -> p (c -> c -> c) -> p c -> p c -> p c
forall (p :: * -> *) a b c.
ExtAlternative p =>
String -> p a -> p b -> c -> c
must_be_non_empties String
"pChainr_ng"p (c -> c -> c)
op p c
x p c
r wherer :: p c
r =p c
x p c -> p (c -> c) -> p c
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**>(((c -> c -> c) -> c -> c -> c
forall a b c. (a -> b -> c) -> b -> a -> c
flip((c -> c -> c) -> c -> c -> c)
-> p (c -> c -> c) -> p (c -> c -> c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p (c -> c -> c)
op p (c -> c -> c) -> p c -> p (c -> c)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>p c
r )p (c -> c) -> p (c -> c) -> p (c -> c)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>(c -> c) -> p (c -> c)
forall (f :: * -> *) a. Applicative f => a -> f a
purec -> c
forall a. a -> a
id)-- ** Treating the operator as left associativepChainl ::IsParser p =>p (c ->c ->c )->p c ->p c pChainl :: p (c -> c -> c) -> p c -> p c
pChainl p (c -> c -> c)
op p c
x =String -> p (c -> c -> c) -> p c -> p c -> p c
forall (p :: * -> *) a b c.
ExtAlternative p =>
String -> p a -> p b -> c -> c
must_be_non_empties String
"pChainl"p (c -> c -> c)
op p c
x (c -> [c -> c] -> c
forall t. t -> [t -> t] -> t
f (c -> [c -> c] -> c) -> p c -> p ([c -> c] -> c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p c
x p ([c -> c] -> c) -> p [c -> c] -> p c
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>p (c -> c) -> p [c -> c]
forall (p :: * -> *) a. IsParser p => p a -> p [a]
pList ((c -> c -> c) -> c -> c -> c
forall a b c. (a -> b -> c) -> b -> a -> c
flip((c -> c -> c) -> c -> c -> c)
-> p (c -> c -> c) -> p (c -> c -> c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p (c -> c -> c)
op p (c -> c -> c) -> p c -> p (c -> c)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>p c
x ))wheref :: t -> [t -> t] -> t
f t
x []=t
x f t
x (t -> t
func :[t -> t]
rest )=t -> [t -> t] -> t
f (t -> t
func t
x )[t -> t]
rest pChainl_ng ::IsParser p =>p (c ->c ->c )->p c ->p c pChainl_ng :: p (c -> c -> c) -> p c -> p c
pChainl_ng p (c -> c -> c)
op p c
x =String -> p (c -> c -> c) -> p c -> p c -> p c
forall (p :: * -> *) a b c.
ExtAlternative p =>
String -> p a -> p b -> c -> c
must_be_non_empties String
"pChainl_ng"p (c -> c -> c)
op p c
x (c -> [c -> c] -> c
forall t. t -> [t -> t] -> t
f (c -> [c -> c] -> c) -> p c -> p ([c -> c] -> c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p c
x p ([c -> c] -> c) -> p [c -> c] -> p c
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>p (c -> c) -> p [c -> c]
forall (p :: * -> *) a. IsParser p => p a -> p [a]
pList_ng ((c -> c -> c) -> c -> c -> c
forall a b c. (a -> b -> c) -> b -> a -> c
flip((c -> c -> c) -> c -> c -> c)
-> p (c -> c -> c) -> p (c -> c -> c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p (c -> c -> c)
op p (c -> c -> c) -> p c -> p (c -> c)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>p c
x ))wheref :: t -> [t -> t] -> t
f t
x []=t
x f t
x (t -> t
func :[t -> t]
rest )=t -> [t -> t] -> t
f (t -> t
func t
x )[t -> t]
rest -- * Repeating parsers-- | `pExact` recognises a specified number of elementspExact ::(IsParser f )=>Int->f a ->f [a ]pExact :: Int -> f a -> f [a]
pExact Int
n f a
p |Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
0=[a] -> f [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure[]|Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
0=(:)(a -> [a] -> [a]) -> f a -> f ([a] -> [a])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>f a
p f ([a] -> [a]) -> f [a] -> f [a]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>Int -> f a -> f [a]
forall (f :: * -> *) a. IsParser f => Int -> f a -> f [a]
pExact (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1)f a
p pBetween ::(IsParser f )=>Int->Int->f a ->f [a ]pBetween :: Int -> Int -> f a -> f [a]
pBetween Int
m Int
n f a
p |Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<Int
0Bool -> Bool -> Bool
||Int
m Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<Int
0=String -> f [a]
forall a. HasCallStack => String -> a
errorString
"negative arguments to pBwteeen"|Int
m Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
n =f [a]
forall (f :: * -> *) a. Alternative f => f a
empty|Bool
otherwise=[a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
(++)([a] -> [a] -> [a]) -> f [a] -> f ([a] -> [a])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>Int -> f a -> f [a]
forall (f :: * -> *) a. IsParser f => Int -> f a -> f [a]
pExact Int
m f a
p f ([a] -> [a]) -> f [a] -> f [a]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>Int -> f a -> f [a]
forall (f :: * -> *) a. IsParser f => Int -> f a -> f [a]
pAtMost (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
m )f a
p pAtLeast ::(IsParser f )=>Int->f a ->f [a ]pAtLeast :: Int -> f a -> f [a]
pAtLeast Int
n f a
p =[a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
(++)([a] -> [a] -> [a]) -> f [a] -> f ([a] -> [a])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>Int -> f a -> f [a]
forall (f :: * -> *) a. IsParser f => Int -> f a -> f [a]
pExact Int
n f a
p f ([a] -> [a]) -> f [a] -> f [a]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>f a -> f [a]
forall (p :: * -> *) a. IsParser p => p a -> p [a]
pList f a
p pAtMost ::(IsParser f )=>Int->f a ->f [a ]pAtMost :: Int -> f a -> f [a]
pAtMost Int
n f a
p |Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
0=(:)(a -> [a] -> [a]) -> f a -> f ([a] -> [a])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>f a
p f ([a] -> [a]) -> f [a] -> f [a]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>Int -> f a -> f [a]
forall (f :: * -> *) a. IsParser f => Int -> f a -> f [a]
pAtMost (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1)f a
p f [a] -> [a] -> f [a]
forall (p :: * -> *) a. ExtAlternative p => p a -> a -> p a
`opt` []|Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
0=[a] -> f [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure[]-- * Counting Parser-- | Count the number of times @p@ has succeededpCount ::(IsParser p ,Numb )=>p a ->p b pCount :: p a -> p b
pCount p a
p =(\a
_b
b ->b
b b -> b -> b
forall a. Num a => a -> a -> a
+b
1)(a -> b -> b) -> p a -> p (b -> b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>p a
p p (b -> b) -> p b -> p b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>p a -> p b
forall (p :: * -> *) b a. (IsParser p, Num b) => p a -> p b
pCount p a
p p b -> b -> p b
forall (p :: * -> *) a. ExtAlternative p => p a -> a -> p a
`opt` b
0-- * Miscelleneous -- | Build a parser for each element in the argument list and try them all.pAny ::IsParser p =>(a ->p a1 )->[a ]->p a1 pAny :: (a -> p a1) -> [a] -> p a1
pAny a -> p a1
f [a]
l =(p a1 -> p a1 -> p a1) -> p a1 -> [p a1] -> p a1
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldrp a1 -> p a1 -> p a1
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>)p a1
forall (p :: * -> *) a. Alternative p => p a
pFail ((a -> p a1) -> [a] -> [p a1]
forall a b. (a -> b) -> [a] -> [b]
mapa -> p a1
f [a]
l )-- | pSym was removed because the class Provides was eliminated-- pAnySym :: Provides st s s => [s] -> P st s-- pAnySym = pAny pSym 

AltStyle によって変換されたページ (->オリジナル) /