module Toml.FromValue.Matcher (
Matcher,
Result(..),
MatchMessage(..),
runMatcher,
withScope,
getScope,
warning,
Scope(..),
inKey,
inIndex,
) where
import Control.Applicative (Alternative(..))
import Control.Monad (MonadPlus)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Except (Except, runExcept, throwE)
import Control.Monad.Trans.Reader (asks, local, ReaderT(..))
import Control.Monad.Trans.Writer.CPS (runWriterT, tell, WriterT)
import Data.Monoid (Endo(..))
newtype Matcher a = Matcher (ReaderT [Scope] (WriterT (DList MatchMessage) (Except (DList MatchMessage))) a)
deriving ((forall a b. (a -> b) -> Matcher a -> Matcher b)
-> (forall a b. a -> Matcher b -> Matcher a) -> Functor Matcher
forall a b. a -> Matcher b -> Matcher a
forall a b. (a -> b) -> Matcher a -> Matcher b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Matcher a -> Matcher b
fmap :: forall a b. (a -> b) -> Matcher a -> Matcher b
$c<$ :: forall a b. a -> Matcher b -> Matcher a
<$ :: forall a b. a -> Matcher b -> Matcher a
Functor, Functor Matcher
Functor Matcher =>
(forall a. a -> Matcher a)
-> (forall a b. Matcher (a -> b) -> Matcher a -> Matcher b)
-> (forall a b c.
(a -> b -> c) -> Matcher a -> Matcher b -> Matcher c)
-> (forall a b. Matcher a -> Matcher b -> Matcher b)
-> (forall a b. Matcher a -> Matcher b -> Matcher a)
-> Applicative Matcher
forall a. a -> Matcher a
forall a b. Matcher a -> Matcher b -> Matcher a
forall a b. Matcher a -> Matcher b -> Matcher b
forall a b. Matcher (a -> b) -> Matcher a -> Matcher b
forall a b c. (a -> b -> c) -> Matcher a -> Matcher b -> Matcher c
forall (f :: * -> *).
Functor f =>
(forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
$cpure :: forall a. a -> Matcher a
pure :: forall a. a -> Matcher a
$c<*> :: forall a b. Matcher (a -> b) -> Matcher a -> Matcher b
<*> :: forall a b. Matcher (a -> b) -> Matcher a -> Matcher b
$cliftA2 :: forall a b c. (a -> b -> c) -> Matcher a -> Matcher b -> Matcher c
liftA2 :: forall a b c. (a -> b -> c) -> Matcher a -> Matcher b -> Matcher c
$c*> :: forall a b. Matcher a -> Matcher b -> Matcher b
*> :: forall a b. Matcher a -> Matcher b -> Matcher b
$c<* :: forall a b. Matcher a -> Matcher b -> Matcher a
<* :: forall a b. Matcher a -> Matcher b -> Matcher a
Applicative, Applicative Matcher
Applicative Matcher =>
(forall a b. Matcher a -> (a -> Matcher b) -> Matcher b)
-> (forall a b. Matcher a -> Matcher b -> Matcher b)
-> (forall a. a -> Matcher a)
-> Monad Matcher
forall a. a -> Matcher a
forall a b. Matcher a -> Matcher b -> Matcher b
forall a b. Matcher a -> (a -> Matcher b) -> Matcher b
forall (m :: * -> *).
Applicative m =>
(forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
$c>>= :: forall a b. Matcher a -> (a -> Matcher b) -> Matcher b
>>= :: forall a b. Matcher a -> (a -> Matcher b) -> Matcher b
$c>> :: forall a b. Matcher a -> Matcher b -> Matcher b
>> :: forall a b. Matcher a -> Matcher b -> Matcher b
$creturn :: forall a. a -> Matcher a
return :: forall a. a -> Matcher a
Monad, Applicative Matcher
Applicative Matcher =>
(forall a. Matcher a)
-> (forall a. Matcher a -> Matcher a -> Matcher a)
-> (forall a. Matcher a -> Matcher [a])
-> (forall a. Matcher a -> Matcher [a])
-> Alternative Matcher
forall a. Matcher a
forall a. Matcher a -> Matcher [a]
forall a. Matcher a -> Matcher a -> Matcher a
forall (f :: * -> *).
Applicative f =>
(forall a. f a)
-> (forall a. f a -> f a -> f a)
-> (forall a. f a -> f [a])
-> (forall a. f a -> f [a])
-> Alternative f
$cempty :: forall a. Matcher a
empty :: forall a. Matcher a
$c<|> :: forall a. Matcher a -> Matcher a -> Matcher a
<|> :: forall a. Matcher a -> Matcher a -> Matcher a
$csome :: forall a. Matcher a -> Matcher [a]
some :: forall a. Matcher a -> Matcher [a]
$cmany :: forall a. Matcher a -> Matcher [a]
many :: forall a. Matcher a -> Matcher [a]
Alternative, Monad Matcher
Alternative Matcher
(Alternative Matcher, Monad Matcher) =>
(forall a. Matcher a)
-> (forall a. Matcher a -> Matcher a -> Matcher a)
-> MonadPlus Matcher
forall a. Matcher a
forall a. Matcher a -> Matcher a -> Matcher a
forall (m :: * -> *).
(Alternative m, Monad m) =>
(forall a. m a) -> (forall a. m a -> m a -> m a) -> MonadPlus m
$cmzero :: forall a. Matcher a
mzero :: forall a. Matcher a
$cmplus :: forall a. Matcher a -> Matcher a -> Matcher a
mplus :: forall a. Matcher a -> Matcher a -> Matcher a
MonadPlus)
data Scope
= ScopeIndex Int
| ScopeKey String
deriving (
ReadPrec [Scope]
ReadPrec Scope
Int -> ReadS Scope
ReadS [Scope]
(Int -> ReadS Scope)
-> ReadS [Scope]
-> ReadPrec Scope
-> ReadPrec [Scope]
-> Read Scope
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Scope
readsPrec :: Int -> ReadS Scope
$creadList :: ReadS [Scope]
readList :: ReadS [Scope]
$creadPrec :: ReadPrec Scope
readPrec :: ReadPrec Scope
$creadListPrec :: ReadPrec [Scope]
readListPrec :: ReadPrec [Scope]
Read ,
Int -> Scope -> ShowS
[Scope] -> ShowS
Scope -> String
(Int -> Scope -> ShowS)
-> (Scope -> String) -> ([Scope] -> ShowS) -> Show Scope
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Scope -> ShowS
showsPrec :: Int -> Scope -> ShowS
$cshow :: Scope -> String
show :: Scope -> String
$cshowList :: [Scope] -> ShowS
showList :: [Scope] -> ShowS
Show ,
Scope -> Scope -> Bool
(Scope -> Scope -> Bool) -> (Scope -> Scope -> Bool) -> Eq Scope
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Scope -> Scope -> Bool
== :: Scope -> Scope -> Bool
$c/= :: Scope -> Scope -> Bool
/= :: Scope -> Scope -> Bool
Eq ,
Eq Scope
Eq Scope =>
(Scope -> Scope -> Ordering)
-> (Scope -> Scope -> Bool)
-> (Scope -> Scope -> Bool)
-> (Scope -> Scope -> Bool)
-> (Scope -> Scope -> Bool)
-> (Scope -> Scope -> Scope)
-> (Scope -> Scope -> Scope)
-> Ord Scope
Scope -> Scope -> Bool
Scope -> Scope -> Ordering
Scope -> Scope -> Scope
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Scope -> Scope -> Ordering
compare :: Scope -> Scope -> Ordering
$c< :: Scope -> Scope -> Bool
< :: Scope -> Scope -> Bool
$c<= :: Scope -> Scope -> Bool
<= :: Scope -> Scope -> Bool
$c> :: Scope -> Scope -> Bool
> :: Scope -> Scope -> Bool
$c>= :: Scope -> Scope -> Bool
>= :: Scope -> Scope -> Bool
$cmax :: Scope -> Scope -> Scope
max :: Scope -> Scope -> Scope
$cmin :: Scope -> Scope -> Scope
min :: Scope -> Scope -> Scope
Ord )
data MatchMessage = MatchMessage {
MatchMessage -> [Scope]
matchPath :: [Scope],
MatchMessage -> String
matchMessage :: String
} deriving (
ReadPrec [MatchMessage]
ReadPrec MatchMessage
Int -> ReadS MatchMessage
ReadS [MatchMessage]
(Int -> ReadS MatchMessage)
-> ReadS [MatchMessage]
-> ReadPrec MatchMessage
-> ReadPrec [MatchMessage]
-> Read MatchMessage
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS MatchMessage
readsPrec :: Int -> ReadS MatchMessage
$creadList :: ReadS [MatchMessage]
readList :: ReadS [MatchMessage]
$creadPrec :: ReadPrec MatchMessage
readPrec :: ReadPrec MatchMessage
$creadListPrec :: ReadPrec [MatchMessage]
readListPrec :: ReadPrec [MatchMessage]
Read ,
Int -> MatchMessage -> ShowS
[MatchMessage] -> ShowS
MatchMessage -> String
(Int -> MatchMessage -> ShowS)
-> (MatchMessage -> String)
-> ([MatchMessage] -> ShowS)
-> Show MatchMessage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MatchMessage -> ShowS
showsPrec :: Int -> MatchMessage -> ShowS
$cshow :: MatchMessage -> String
show :: MatchMessage -> String
$cshowList :: [MatchMessage] -> ShowS
showList :: [MatchMessage] -> ShowS
Show ,
MatchMessage -> MatchMessage -> Bool
(MatchMessage -> MatchMessage -> Bool)
-> (MatchMessage -> MatchMessage -> Bool) -> Eq MatchMessage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MatchMessage -> MatchMessage -> Bool
== :: MatchMessage -> MatchMessage -> Bool
$c/= :: MatchMessage -> MatchMessage -> Bool
/= :: MatchMessage -> MatchMessage -> Bool
Eq ,
Eq MatchMessage
Eq MatchMessage =>
(MatchMessage -> MatchMessage -> Ordering)
-> (MatchMessage -> MatchMessage -> Bool)
-> (MatchMessage -> MatchMessage -> Bool)
-> (MatchMessage -> MatchMessage -> Bool)
-> (MatchMessage -> MatchMessage -> Bool)
-> (MatchMessage -> MatchMessage -> MatchMessage)
-> (MatchMessage -> MatchMessage -> MatchMessage)
-> Ord MatchMessage
MatchMessage -> MatchMessage -> Bool
MatchMessage -> MatchMessage -> Ordering
MatchMessage -> MatchMessage -> MatchMessage
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: MatchMessage -> MatchMessage -> Ordering
compare :: MatchMessage -> MatchMessage -> Ordering
$c< :: MatchMessage -> MatchMessage -> Bool
< :: MatchMessage -> MatchMessage -> Bool
$c<= :: MatchMessage -> MatchMessage -> Bool
<= :: MatchMessage -> MatchMessage -> Bool
$c> :: MatchMessage -> MatchMessage -> Bool
> :: MatchMessage -> MatchMessage -> Bool
$c>= :: MatchMessage -> MatchMessage -> Bool
>= :: MatchMessage -> MatchMessage -> Bool
$cmax :: MatchMessage -> MatchMessage -> MatchMessage
max :: MatchMessage -> MatchMessage -> MatchMessage
$cmin :: MatchMessage -> MatchMessage -> MatchMessage
min :: MatchMessage -> MatchMessage -> MatchMessage
Ord )
newtype DList a = DList (Endo [a])
deriving (NonEmpty (DList a) -> DList a
DList a -> DList a -> DList a
(DList a -> DList a -> DList a)
-> (NonEmpty (DList a) -> DList a)
-> (forall b. Integral b => b -> DList a -> DList a)
-> Semigroup (DList a)
forall b. Integral b => b -> DList a -> DList a
forall a. NonEmpty (DList a) -> DList a
forall a. DList a -> DList a -> DList a
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
forall a b. Integral b => b -> DList a -> DList a
$c<> :: forall a. DList a -> DList a -> DList a
<> :: DList a -> DList a -> DList a
$csconcat :: forall a. NonEmpty (DList a) -> DList a
sconcat :: NonEmpty (DList a) -> DList a
$cstimes :: forall a b. Integral b => b -> DList a -> DList a
stimes :: forall b. Integral b => b -> DList a -> DList a
Semigroup, Semigroup (DList a)
DList a
Semigroup (DList a) =>
DList a
-> (DList a -> DList a -> DList a)
-> ([DList a] -> DList a)
-> Monoid (DList a)
[DList a] -> DList a
DList a -> DList a -> DList a
forall a. Semigroup (DList a)
forall a. DList a
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
forall a. [DList a] -> DList a
forall a. DList a -> DList a -> DList a
$cmempty :: forall a. DList a
mempty :: DList a
$cmappend :: forall a. DList a -> DList a -> DList a
mappend :: DList a -> DList a -> DList a
$cmconcat :: forall a. [DList a] -> DList a
mconcat :: [DList a] -> DList a
Monoid)
one :: a -> DList a
one :: forall a. a -> DList a
one a
x = Endo [a] -> DList a
forall a. Endo [a] -> DList a
DList (([a] -> [a]) -> Endo [a]
forall a. (a -> a) -> Endo a
Endo (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:))
runDList :: DList a -> [a]
runDList :: forall a. DList a -> [a]
runDList (DList Endo [a]
x) = Endo [a]
x Endo [a] -> [a] -> [a]
forall a. Endo a -> a -> a
`appEndo` []
data Result e a
= Failure [e]
| Success [e] a
deriving (
ReadPrec [Result e a]
ReadPrec (Result e a)
Int -> ReadS (Result e a)
ReadS [Result e a]
(Int -> ReadS (Result e a))
-> ReadS [Result e a]
-> ReadPrec (Result e a)
-> ReadPrec [Result e a]
-> Read (Result e a)
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall e a. (Read e, Read a) => ReadPrec [Result e a]
forall e a. (Read e, Read a) => ReadPrec (Result e a)
forall e a. (Read e, Read a) => Int -> ReadS (Result e a)
forall e a. (Read e, Read a) => ReadS [Result e a]
$creadsPrec :: forall e a. (Read e, Read a) => Int -> ReadS (Result e a)
readsPrec :: Int -> ReadS (Result e a)
$creadList :: forall e a. (Read e, Read a) => ReadS [Result e a]
readList :: ReadS [Result e a]
$creadPrec :: forall e a. (Read e, Read a) => ReadPrec (Result e a)
readPrec :: ReadPrec (Result e a)
$creadListPrec :: forall e a. (Read e, Read a) => ReadPrec [Result e a]
readListPrec :: ReadPrec [Result e a]
Read ,
Int -> Result e a -> ShowS
[Result e a] -> ShowS
Result e a -> String
(Int -> Result e a -> ShowS)
-> (Result e a -> String)
-> ([Result e a] -> ShowS)
-> Show (Result e a)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall e a. (Show e, Show a) => Int -> Result e a -> ShowS
forall e a. (Show e, Show a) => [Result e a] -> ShowS
forall e a. (Show e, Show a) => Result e a -> String
$cshowsPrec :: forall e a. (Show e, Show a) => Int -> Result e a -> ShowS
showsPrec :: Int -> Result e a -> ShowS
$cshow :: forall e a. (Show e, Show a) => Result e a -> String
show :: Result e a -> String
$cshowList :: forall e a. (Show e, Show a) => [Result e a] -> ShowS
showList :: [Result e a] -> ShowS
Show ,
Result e a -> Result e a -> Bool
(Result e a -> Result e a -> Bool)
-> (Result e a -> Result e a -> Bool) -> Eq (Result e a)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall e a. (Eq e, Eq a) => Result e a -> Result e a -> Bool
$c== :: forall e a. (Eq e, Eq a) => Result e a -> Result e a -> Bool
== :: Result e a -> Result e a -> Bool
$c/= :: forall e a. (Eq e, Eq a) => Result e a -> Result e a -> Bool
/= :: Result e a -> Result e a -> Bool
Eq ,
Eq (Result e a)
Eq (Result e a) =>
(Result e a -> Result e a -> Ordering)
-> (Result e a -> Result e a -> Bool)
-> (Result e a -> Result e a -> Bool)
-> (Result e a -> Result e a -> Bool)
-> (Result e a -> Result e a -> Bool)
-> (Result e a -> Result e a -> Result e a)
-> (Result e a -> Result e a -> Result e a)
-> Ord (Result e a)
Result e a -> Result e a -> Bool
Result e a -> Result e a -> Ordering
Result e a -> Result e a -> Result e a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall e a. (Ord e, Ord a) => Eq (Result e a)
forall e a. (Ord e, Ord a) => Result e a -> Result e a -> Bool
forall e a. (Ord e, Ord a) => Result e a -> Result e a -> Ordering
forall e a.
(Ord e, Ord a) =>
Result e a -> Result e a -> Result e a
$ccompare :: forall e a. (Ord e, Ord a) => Result e a -> Result e a -> Ordering
compare :: Result e a -> Result e a -> Ordering
$c< :: forall e a. (Ord e, Ord a) => Result e a -> Result e a -> Bool
< :: Result e a -> Result e a -> Bool
$c<= :: forall e a. (Ord e, Ord a) => Result e a -> Result e a -> Bool
<= :: Result e a -> Result e a -> Bool
$c> :: forall e a. (Ord e, Ord a) => Result e a -> Result e a -> Bool
> :: Result e a -> Result e a -> Bool
$c>= :: forall e a. (Ord e, Ord a) => Result e a -> Result e a -> Bool
>= :: Result e a -> Result e a -> Bool
$cmax :: forall e a.
(Ord e, Ord a) =>
Result e a -> Result e a -> Result e a
max :: Result e a -> Result e a -> Result e a
$cmin :: forall e a.
(Ord e, Ord a) =>
Result e a -> Result e a -> Result e a
min :: Result e a -> Result e a -> Result e a
Ord )
runMatcher :: Matcher a -> Result MatchMessage a
runMatcher :: forall a. Matcher a -> Result MatchMessage a
runMatcher (Matcher ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
a
m) =
case Except (DList MatchMessage) (a, DList MatchMessage)
-> Either (DList MatchMessage) (a, DList MatchMessage)
forall e a. Except e a -> Either e a
runExcept (WriterT (DList MatchMessage) (Except (DList MatchMessage)) a
-> Except (DList MatchMessage) (a, DList MatchMessage)
forall w (m :: * -> *) a. Monoid w => WriterT w m a -> m (a, w)
runWriterT (ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
a
-> [Scope]
-> WriterT (DList MatchMessage) (Except (DList MatchMessage)) a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
a
m [])) of
Left DList MatchMessage
e -> [MatchMessage] -> Result MatchMessage a
forall e a. [e] -> Result e a
Failure (DList MatchMessage -> [MatchMessage]
forall a. DList a -> [a]
runDList DList MatchMessage
e)
Right (a
x,DList MatchMessage
w) -> [MatchMessage] -> a -> Result MatchMessage a
forall e a. [e] -> a -> Result e a
Success (DList MatchMessage -> [MatchMessage]
forall a. DList a -> [a]
runDList DList MatchMessage
w) a
x
withScope :: Scope -> Matcher a -> Matcher a
withScope :: forall a. Scope -> Matcher a -> Matcher a
withScope Scope
ctx (Matcher ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
a
m) = ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
a
-> Matcher a
forall a.
ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
a
-> Matcher a
Matcher (([Scope] -> [Scope])
-> ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
a
-> ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
a
forall r (m :: * -> *) a.
(r -> r) -> ReaderT r m a -> ReaderT r m a
local (Scope
ctx Scope -> [Scope] -> [Scope]
forall a. a -> [a] -> [a]
:) ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
a
m)
getScope :: Matcher [Scope]
getScope :: Matcher [Scope]
getScope = ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
[Scope]
-> Matcher [Scope]
forall a.
ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
a
-> Matcher a
Matcher (([Scope] -> [Scope])
-> ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
[Scope]
forall (m :: * -> *) r a. Monad m => (r -> a) -> ReaderT r m a
asks [Scope] -> [Scope]
forall a. [a] -> [a]
reverse)
warning :: String -> Matcher ()
warning :: String -> Matcher ()
warning String
w =
do [Scope]
loc <- Matcher [Scope]
getScope
ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
()
-> Matcher ()
forall a.
ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
a
-> Matcher a
Matcher (WriterT (DList MatchMessage) (Except (DList MatchMessage)) ()
-> ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
()
forall (m :: * -> *) a. Monad m => m a -> ReaderT [Scope] m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DList MatchMessage
-> WriterT (DList MatchMessage) (Except (DList MatchMessage)) ()
forall w (m :: * -> *). (Monoid w, Monad m) => w -> WriterT w m ()
tell (MatchMessage -> DList MatchMessage
forall a. a -> DList a
one ([Scope] -> String -> MatchMessage
MatchMessage [Scope]
loc String
w))))
instance MonadFail Matcher where
fail :: forall a. String -> Matcher a
fail String
e =
do [Scope]
loc <- Matcher [Scope]
getScope
ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
a
-> Matcher a
forall a.
ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
a
-> Matcher a
Matcher (WriterT (DList MatchMessage) (Except (DList MatchMessage)) a
-> ReaderT
[Scope]
(WriterT (DList MatchMessage) (Except (DList MatchMessage)))
a
forall (m :: * -> *) a. Monad m => m a -> ReaderT [Scope] m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Except (DList MatchMessage) a
-> WriterT (DList MatchMessage) (Except (DList MatchMessage)) a
forall (m :: * -> *) a.
Monad m =>
m a -> WriterT (DList MatchMessage) m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (DList MatchMessage -> Except (DList MatchMessage) a
forall (m :: * -> *) e a. Monad m => e -> ExceptT e m a
throwE (MatchMessage -> DList MatchMessage
forall a. a -> DList a
one ([Scope] -> String -> MatchMessage
MatchMessage [Scope]
loc String
e)))))
inKey :: String -> Matcher a -> Matcher a
inKey :: forall a. String -> Matcher a -> Matcher a
inKey = Scope -> Matcher a -> Matcher a
forall a. Scope -> Matcher a -> Matcher a
withScope (Scope -> Matcher a -> Matcher a)
-> (String -> Scope) -> String -> Matcher a -> Matcher a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Scope
ScopeKey
inIndex :: Int -> Matcher a -> Matcher a
inIndex :: forall a. Int -> Matcher a -> Matcher a
inIndex = Scope -> Matcher a -> Matcher a
forall a. Scope -> Matcher a -> Matcher a
withScope (Scope -> Matcher a -> Matcher a)
-> (Int -> Scope) -> Int -> Matcher a -> Matcher a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Scope
ScopeIndex