{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE Safe #-}
module Text.Parsec.Perm
( PermParser
, StreamPermParser
, permute
, (<||>), (<$$>)
, (<|?>), (<$?>)
) where
import Control.Monad.Identity ( Identity )
#if MIN_VERSION_base(4,7,0)
import Data.Typeable ( Typeable )
#else
import Data.Typeable ( Typeable3 )
#endif
import Text.Parsec
infixl 1 <||>, <|?>
infixl 2 <$$>, <$?>
(<||>) :: (Stream s Identity tok) => StreamPermParser s st (a -> b) -> Parsec s st a -> StreamPermParser s st b
<||> :: forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> Parsec s st a -> StreamPermParser s st b
(<||>) StreamPermParser s st (a -> b)
perm Parsec s st a
p = StreamPermParser s st (a -> b)
-> Parsec s st a -> StreamPermParser s st b
forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> Parsec s st a -> StreamPermParser s st b
add StreamPermParser s st (a -> b)
perm Parsec s st a
p
(<$$>) :: (Stream s Identity tok) => (a -> b) -> Parsec s st a -> StreamPermParser s st b
<$$> :: forall s tok a b st.
Stream s Identity tok =>
(a -> b) -> Parsec s st a -> StreamPermParser s st b
(<$$>) a -> b
f Parsec s st a
p = (a -> b) -> StreamPermParser s st (a -> b)
forall s tok a b st.
Stream s Identity tok =>
(a -> b) -> StreamPermParser s st (a -> b)
newperm a -> b
f StreamPermParser s st (a -> b)
-> Parsec s st a -> StreamPermParser s st b
forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> Parsec s st a -> StreamPermParser s st b
<||> Parsec s st a
p
(<|?>) :: (Stream s Identity tok) => StreamPermParser s st (a -> b) -> (a, Parsec s st a) -> StreamPermParser s st b
<|?> :: forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
(<|?>) StreamPermParser s st (a -> b)
perm (a
x,Parsec s st a
p) = StreamPermParser s st (a -> b)
-> a -> Parsec s st a -> StreamPermParser s st b
forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> a -> Parsec s st a -> StreamPermParser s st b
addopt StreamPermParser s st (a -> b)
perm a
x Parsec s st a
p
(<$?>) :: (Stream s Identity tok) => (a -> b) -> (a, Parsec s st a) -> StreamPermParser s st b
<$?> :: forall s tok a b st.
Stream s Identity tok =>
(a -> b) -> (a, Parsec s st a) -> StreamPermParser s st b
(<$?>) a -> b
f (a
x,Parsec s st a
p) = (a -> b) -> StreamPermParser s st (a -> b)
forall s tok a b st.
Stream s Identity tok =>
(a -> b) -> StreamPermParser s st (a -> b)
newperm a -> b
f StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> (a, Parsec s st a) -> StreamPermParser s st b
<|?> (a
x,Parsec s st a
p)
type PermParser tok st a = StreamPermParser String st a
data StreamPermParser s st a = Perm (Maybe a) [StreamBranch s st a]
#if MIN_VERSION_base(4,7,0)
deriving ( Typeable )
#else
deriving instance Typeable3 StreamPermParser
#endif
data StreamBranch s st a = forall b. Branch (StreamPermParser s st (b -> a)) (Parsec s st b)
#if MIN_VERSION_base(4,7,0)
deriving ( Typeable )
#else
deriving instance Typeable3 StreamBranch
#endif
permute :: (Stream s Identity tok) => StreamPermParser s st a -> Parsec s st a
permute :: forall s tok st a.
Stream s Identity tok =>
StreamPermParser s st a -> Parsec s st a
permute (Perm Maybe a
def [StreamBranch s st a]
xs)
= [ParsecT s st Identity a] -> ParsecT s st Identity a
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice ((StreamBranch s st a -> ParsecT s st Identity a)
-> [StreamBranch s st a] -> [ParsecT s st Identity a]
forall a b. (a -> b) -> [a] -> [b]
map StreamBranch s st a -> ParsecT s st Identity a
forall {s} {tok} {st} {a}.
Stream s Identity tok =>
StreamBranch s st a -> ParsecT s st Identity a
branch [StreamBranch s st a]
xs [ParsecT s st Identity a]
-> [ParsecT s st Identity a] -> [ParsecT s st Identity a]
forall a. [a] -> [a] -> [a]
++ [ParsecT s st Identity a]
empty)
where
empty :: [ParsecT s st Identity a]
empty
= case Maybe a
def of
Maybe a
Nothing -> []
Just a
x -> [a -> ParsecT s st Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x]
branch :: StreamBranch s st a -> ParsecT s st Identity a
branch (Branch StreamPermParser s st (b -> a)
perm Parsec s st b
p)
= do{ b
x <- Parsec s st b
p
; b -> a
f <- StreamPermParser s st (b -> a) -> Parsec s st (b -> a)
forall s tok st a.
Stream s Identity tok =>
StreamPermParser s st a -> Parsec s st a
permute StreamPermParser s st (b -> a)
perm
; a -> ParsecT s st Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> a
f b
x)
}
newperm :: (Stream s Identity tok) => (a -> b) -> StreamPermParser s st (a -> b)
newperm :: forall s tok a b st.
Stream s Identity tok =>
(a -> b) -> StreamPermParser s st (a -> b)
newperm a -> b
f
= Maybe (a -> b)
-> [StreamBranch s st (a -> b)] -> StreamPermParser s st (a -> b)
forall s st a.
Maybe a -> [StreamBranch s st a] -> StreamPermParser s st a
Perm ((a -> b) -> Maybe (a -> b)
forall a. a -> Maybe a
Just a -> b
f) []
add :: (Stream s Identity tok) => StreamPermParser s st (a -> b) -> Parsec s st a -> StreamPermParser s st b
add :: forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> Parsec s st a -> StreamPermParser s st b
add perm :: StreamPermParser s st (a -> b)
perm@(Perm Maybe (a -> b)
_mf [StreamBranch s st (a -> b)]
fs) Parsec s st a
p
= Maybe b -> [StreamBranch s st b] -> StreamPermParser s st b
forall s st a.
Maybe a -> [StreamBranch s st a] -> StreamPermParser s st a
Perm Maybe b
forall a. Maybe a
Nothing (StreamBranch s st b
firstStreamBranch s st b
-> [StreamBranch s st b] -> [StreamBranch s st b]
forall a. a -> [a] -> [a]
:(StreamBranch s st (a -> b) -> StreamBranch s st b)
-> [StreamBranch s st (a -> b)] -> [StreamBranch s st b]
forall a b. (a -> b) -> [a] -> [b]
map StreamBranch s st (a -> b) -> StreamBranch s st b
forall {tok} {a}.
Stream s Identity tok =>
StreamBranch s st (a -> a) -> StreamBranch s st a
insert [StreamBranch s st (a -> b)]
fs)
where
first :: StreamBranch s st b
first = StreamPermParser s st (a -> b)
-> Parsec s st a -> StreamBranch s st b
forall s st a b.
StreamPermParser s st (b -> a)
-> Parsec s st b -> StreamBranch s st a
Branch StreamPermParser s st (a -> b)
perm Parsec s st a
p
insert :: StreamBranch s st (a -> a) -> StreamBranch s st a
insert (Branch StreamPermParser s st (b -> a -> a)
perm' Parsec s st b
p')
= StreamPermParser s st (b -> a)
-> Parsec s st b -> StreamBranch s st a
forall s st a b.
StreamPermParser s st (b -> a)
-> Parsec s st b -> StreamBranch s st a
Branch (StreamPermParser s st (a -> b -> a)
-> Parsec s st a -> StreamPermParser s st (b -> a)
forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> Parsec s st a -> StreamPermParser s st b
add (((b -> a -> a) -> a -> b -> a)
-> StreamPermParser s st (b -> a -> a)
-> StreamPermParser s st (a -> b -> a)
forall s tok a b st.
Stream s Identity tok =>
(a -> b) -> StreamPermParser s st a -> StreamPermParser s st b
mapPerms (b -> a -> a) -> a -> b -> a
forall a b c. (a -> b -> c) -> b -> a -> c
flip StreamPermParser s st (b -> a -> a)
perm') Parsec s st a
p) Parsec s st b
p'
addopt :: (Stream s Identity tok) => StreamPermParser s st (a -> b) -> a -> Parsec s st a -> StreamPermParser s st b
addopt :: forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> a -> Parsec s st a -> StreamPermParser s st b
addopt perm :: StreamPermParser s st (a -> b)
perm@(Perm Maybe (a -> b)
mf [StreamBranch s st (a -> b)]
fs) a
x Parsec s st a
p
= Maybe b -> [StreamBranch s st b] -> StreamPermParser s st b
forall s st a.
Maybe a -> [StreamBranch s st a] -> StreamPermParser s st a
Perm (((a -> b) -> b) -> Maybe (a -> b) -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> b) -> a -> b
forall a b. (a -> b) -> a -> b
$ a
x) Maybe (a -> b)
mf) (StreamBranch s st b
firstStreamBranch s st b
-> [StreamBranch s st b] -> [StreamBranch s st b]
forall a. a -> [a] -> [a]
:(StreamBranch s st (a -> b) -> StreamBranch s st b)
-> [StreamBranch s st (a -> b)] -> [StreamBranch s st b]
forall a b. (a -> b) -> [a] -> [b]
map StreamBranch s st (a -> b) -> StreamBranch s st b
forall {tok} {a}.
Stream s Identity tok =>
StreamBranch s st (a -> a) -> StreamBranch s st a
insert [StreamBranch s st (a -> b)]
fs)
where
first :: StreamBranch s st b
first = StreamPermParser s st (a -> b)
-> Parsec s st a -> StreamBranch s st b
forall s st a b.
StreamPermParser s st (b -> a)
-> Parsec s st b -> StreamBranch s st a
Branch StreamPermParser s st (a -> b)
perm Parsec s st a
p
insert :: StreamBranch s st (a -> a) -> StreamBranch s st a
insert (Branch StreamPermParser s st (b -> a -> a)
perm' Parsec s st b
p')
= StreamPermParser s st (b -> a)
-> Parsec s st b -> StreamBranch s st a
forall s st a b.
StreamPermParser s st (b -> a)
-> Parsec s st b -> StreamBranch s st a
Branch (StreamPermParser s st (a -> b -> a)
-> a -> Parsec s st a -> StreamPermParser s st (b -> a)
forall s tok st a b.
Stream s Identity tok =>
StreamPermParser s st (a -> b)
-> a -> Parsec s st a -> StreamPermParser s st b
addopt (((b -> a -> a) -> a -> b -> a)
-> StreamPermParser s st (b -> a -> a)
-> StreamPermParser s st (a -> b -> a)
forall s tok a b st.
Stream s Identity tok =>
(a -> b) -> StreamPermParser s st a -> StreamPermParser s st b
mapPerms (b -> a -> a) -> a -> b -> a
forall a b c. (a -> b -> c) -> b -> a -> c
flip StreamPermParser s st (b -> a -> a)
perm') a
x Parsec s st a
p) Parsec s st b
p'
mapPerms :: (Stream s Identity tok) => (a -> b) -> StreamPermParser s st a -> StreamPermParser s st b
mapPerms :: forall s tok a b st.
Stream s Identity tok =>
(a -> b) -> StreamPermParser s st a -> StreamPermParser s st b
mapPerms a -> b
f (Perm Maybe a
x [StreamBranch s st a]
xs)
= Maybe b -> [StreamBranch s st b] -> StreamPermParser s st b
forall s st a.
Maybe a -> [StreamBranch s st a] -> StreamPermParser s st a
Perm ((a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Maybe a
x) ((StreamBranch s st a -> StreamBranch s st b)
-> [StreamBranch s st a] -> [StreamBranch s st b]
forall a b. (a -> b) -> [a] -> [b]
map StreamBranch s st a -> StreamBranch s st b
forall {s} {tok} {st}.
Stream s Identity tok =>
StreamBranch s st a -> StreamBranch s st b
mapBranch [StreamBranch s st a]
xs)
where
mapBranch :: StreamBranch s st a -> StreamBranch s st b
mapBranch (Branch StreamPermParser s st (b -> a)
perm Parsec s st b
p)
= StreamPermParser s st (b -> b)
-> Parsec s st b -> StreamBranch s st b
forall s st a b.
StreamPermParser s st (b -> a)
-> Parsec s st b -> StreamBranch s st a
Branch (((b -> a) -> b -> b)
-> StreamPermParser s st (b -> a) -> StreamPermParser s st (b -> b)
forall s tok a b st.
Stream s Identity tok =>
(a -> b) -> StreamPermParser s st a -> StreamPermParser s st b
mapPerms (a -> b
f(a -> b) -> (b -> a) -> b -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) StreamPermParser s st (b -> a)
perm) Parsec s st b
p