{-# OPTIONS_HADDOCK show-extensions #-}
{-# OPTIONS_GHC -Wwarn #-}
{-# LANGUAGE CPP
             , GeneralizedNewtypeDeriving
             , FlexibleInstances
             , MultiParamTypeClasses
             , StandaloneDeriving
             , UndecidableInstances #-}
module Unbound.Generics.LocallyNameless.LFresh
       (
         
         LFresh(..),
         LFreshM, runLFreshM, contLFreshM,
         LFreshMT(..), runLFreshMT, contLFreshMT
       ) where
import Data.Set (Set)
import qualified Data.Set as S
import Data.Monoid
import Data.Typeable (Typeable)
import Control.Monad.Catch (MonadThrow, MonadCatch, MonadMask)
#if MIN_VERSION_base(4,9,0)
import qualified Control.Monad.Fail as Fail
#endif
#if MIN_VERSION_mtl(2,3,0)
import Control.Monad (MonadPlus)
import Control.Monad.Fix (MonadFix)
#endif
import Control.Monad.Reader
import Control.Monad.Identity
import Control.Applicative (Applicative, Alternative)
import Control.Monad.Trans.Cont
import Control.Monad.Trans.Error
import Control.Monad.Trans.Except
import Control.Monad.Trans.Identity
import Control.Monad.Trans.List
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.State.Lazy as Lazy
import Control.Monad.Trans.State.Strict as Strict
import Control.Monad.Trans.Writer.Lazy as Lazy
import Control.Monad.Trans.Writer.Strict as Strict
import qualified Control.Monad.Cont.Class as CC
import qualified Control.Monad.Error.Class as EC
import qualified Control.Monad.State.Class as StC
import qualified Control.Monad.Reader.Class as RC
import qualified Control.Monad.Writer.Class as WC
import Unbound.Generics.LocallyNameless.Name
class Monad m => LFresh m where
  
  lfresh  :: Typeable a => Name a -> m (Name a)
  
  
  avoid   :: [AnyName] -> m a -> m a
  
  getAvoids :: m (Set AnyName)
newtype LFreshMT m a = LFreshMT { forall (m :: * -> *) a. LFreshMT m a -> ReaderT (Set AnyName) m a
unLFreshMT :: ReaderT (Set AnyName) m a }
  deriving
    ( (forall a b. (a -> b) -> LFreshMT m a -> LFreshMT m b)
-> (forall a b. a -> LFreshMT m b -> LFreshMT m a)
-> Functor (LFreshMT m)
forall a b. a -> LFreshMT m b -> LFreshMT m a
forall a b. (a -> b) -> LFreshMT m a -> LFreshMT m b
forall (m :: * -> *) a b.
Functor m =>
a -> LFreshMT m b -> LFreshMT m a
forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> LFreshMT m a -> LFreshMT m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> LFreshMT m b -> LFreshMT m a
$c<$ :: forall (m :: * -> *) a b.
Functor m =>
a -> LFreshMT m b -> LFreshMT m a
fmap :: forall a b. (a -> b) -> LFreshMT m a -> LFreshMT m b
$cfmap :: forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> LFreshMT m a -> LFreshMT m b
Functor
    , Functor (LFreshMT m)
Functor (LFreshMT m)
-> (forall a. a -> LFreshMT m a)
-> (forall a b.
    LFreshMT m (a -> b) -> LFreshMT m a -> LFreshMT m b)
-> (forall a b c.
    (a -> b -> c) -> LFreshMT m a -> LFreshMT m b -> LFreshMT m c)
-> (forall a b. LFreshMT m a -> LFreshMT m b -> LFreshMT m b)
-> (forall a b. LFreshMT m a -> LFreshMT m b -> LFreshMT m a)
-> Applicative (LFreshMT m)
forall a. a -> LFreshMT m a
forall a b. LFreshMT m a -> LFreshMT m b -> LFreshMT m a
forall a b. LFreshMT m a -> LFreshMT m b -> LFreshMT m b
forall a b. LFreshMT m (a -> b) -> LFreshMT m a -> LFreshMT m b
forall a b c.
(a -> b -> c) -> LFreshMT m a -> LFreshMT m b -> LFreshMT m 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
forall {m :: * -> *}. Applicative m => Functor (LFreshMT m)
forall (m :: * -> *) a. Applicative m => a -> LFreshMT m a
forall (m :: * -> *) a b.
Applicative m =>
LFreshMT m a -> LFreshMT m b -> LFreshMT m a
forall (m :: * -> *) a b.
Applicative m =>
LFreshMT m a -> LFreshMT m b -> LFreshMT m b
forall (m :: * -> *) a b.
Applicative m =>
LFreshMT m (a -> b) -> LFreshMT m a -> LFreshMT m b
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c) -> LFreshMT m a -> LFreshMT m b -> LFreshMT m c
<* :: forall a b. LFreshMT m a -> LFreshMT m b -> LFreshMT m a
$c<* :: forall (m :: * -> *) a b.
Applicative m =>
LFreshMT m a -> LFreshMT m b -> LFreshMT m a
*> :: forall a b. LFreshMT m a -> LFreshMT m b -> LFreshMT m b
$c*> :: forall (m :: * -> *) a b.
Applicative m =>
LFreshMT m a -> LFreshMT m b -> LFreshMT m b
liftA2 :: forall a b c.
(a -> b -> c) -> LFreshMT m a -> LFreshMT m b -> LFreshMT m c
$cliftA2 :: forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c) -> LFreshMT m a -> LFreshMT m b -> LFreshMT m c
<*> :: forall a b. LFreshMT m (a -> b) -> LFreshMT m a -> LFreshMT m b
$c<*> :: forall (m :: * -> *) a b.
Applicative m =>
LFreshMT m (a -> b) -> LFreshMT m a -> LFreshMT m b
pure :: forall a. a -> LFreshMT m a
$cpure :: forall (m :: * -> *) a. Applicative m => a -> LFreshMT m a
Applicative
    , Applicative (LFreshMT m)
Applicative (LFreshMT m)
-> (forall a. LFreshMT m a)
-> (forall a. LFreshMT m a -> LFreshMT m a -> LFreshMT m a)
-> (forall a. LFreshMT m a -> LFreshMT m [a])
-> (forall a. LFreshMT m a -> LFreshMT m [a])
-> Alternative (LFreshMT m)
forall a. LFreshMT m a
forall a. LFreshMT m a -> LFreshMT m [a]
forall a. LFreshMT m a -> LFreshMT m a -> LFreshMT m 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
forall {m :: * -> *}. Alternative m => Applicative (LFreshMT m)
forall (m :: * -> *) a. Alternative m => LFreshMT m a
forall (m :: * -> *) a.
Alternative m =>
LFreshMT m a -> LFreshMT m [a]
forall (m :: * -> *) a.
Alternative m =>
LFreshMT m a -> LFreshMT m a -> LFreshMT m a
many :: forall a. LFreshMT m a -> LFreshMT m [a]
$cmany :: forall (m :: * -> *) a.
Alternative m =>
LFreshMT m a -> LFreshMT m [a]
some :: forall a. LFreshMT m a -> LFreshMT m [a]
$csome :: forall (m :: * -> *) a.
Alternative m =>
LFreshMT m a -> LFreshMT m [a]
<|> :: forall a. LFreshMT m a -> LFreshMT m a -> LFreshMT m a
$c<|> :: forall (m :: * -> *) a.
Alternative m =>
LFreshMT m a -> LFreshMT m a -> LFreshMT m a
empty :: forall a. LFreshMT m a
$cempty :: forall (m :: * -> *) a. Alternative m => LFreshMT m a
Alternative
    , Applicative (LFreshMT m)
Applicative (LFreshMT m)
-> (forall a b.
    LFreshMT m a -> (a -> LFreshMT m b) -> LFreshMT m b)
-> (forall a b. LFreshMT m a -> LFreshMT m b -> LFreshMT m b)
-> (forall a. a -> LFreshMT m a)
-> Monad (LFreshMT m)
forall a. a -> LFreshMT m a
forall a b. LFreshMT m a -> LFreshMT m b -> LFreshMT m b
forall a b. LFreshMT m a -> (a -> LFreshMT m b) -> LFreshMT m b
forall {m :: * -> *}. Monad m => Applicative (LFreshMT m)
forall (m :: * -> *) a. Monad m => a -> LFreshMT m a
forall (m :: * -> *) a b.
Monad m =>
LFreshMT m a -> LFreshMT m b -> LFreshMT m b
forall (m :: * -> *) a b.
Monad m =>
LFreshMT m a -> (a -> LFreshMT m b) -> LFreshMT m 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
return :: forall a. a -> LFreshMT m a
$creturn :: forall (m :: * -> *) a. Monad m => a -> LFreshMT m a
>> :: forall a b. LFreshMT m a -> LFreshMT m b -> LFreshMT m b
$c>> :: forall (m :: * -> *) a b.
Monad m =>
LFreshMT m a -> LFreshMT m b -> LFreshMT m b
>>= :: forall a b. LFreshMT m a -> (a -> LFreshMT m b) -> LFreshMT m b
$c>>= :: forall (m :: * -> *) a b.
Monad m =>
LFreshMT m a -> (a -> LFreshMT m b) -> LFreshMT m b
Monad
    , Monad (LFreshMT m)
Monad (LFreshMT m)
-> (forall a. IO a -> LFreshMT m a) -> MonadIO (LFreshMT m)
forall a. IO a -> LFreshMT m a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
forall {m :: * -> *}. MonadIO m => Monad (LFreshMT m)
forall (m :: * -> *) a. MonadIO m => IO a -> LFreshMT m a
liftIO :: forall a. IO a -> LFreshMT m a
$cliftIO :: forall (m :: * -> *) a. MonadIO m => IO a -> LFreshMT m a
MonadIO
    , Monad (LFreshMT m)
Alternative (LFreshMT m)
Alternative (LFreshMT m)
-> Monad (LFreshMT m)
-> (forall a. LFreshMT m a)
-> (forall a. LFreshMT m a -> LFreshMT m a -> LFreshMT m a)
-> MonadPlus (LFreshMT m)
forall a. LFreshMT m a
forall a. LFreshMT m a -> LFreshMT m a -> LFreshMT m a
forall (m :: * -> *).
Alternative m
-> Monad m
-> (forall a. m a)
-> (forall a. m a -> m a -> m a)
-> MonadPlus m
forall {m :: * -> *}. MonadPlus m => Monad (LFreshMT m)
forall {m :: * -> *}. MonadPlus m => Alternative (LFreshMT m)
forall (m :: * -> *) a. MonadPlus m => LFreshMT m a
forall (m :: * -> *) a.
MonadPlus m =>
LFreshMT m a -> LFreshMT m a -> LFreshMT m a
mplus :: forall a. LFreshMT m a -> LFreshMT m a -> LFreshMT m a
$cmplus :: forall (m :: * -> *) a.
MonadPlus m =>
LFreshMT m a -> LFreshMT m a -> LFreshMT m a
mzero :: forall a. LFreshMT m a
$cmzero :: forall (m :: * -> *) a. MonadPlus m => LFreshMT m a
MonadPlus
    , Monad (LFreshMT m)
Monad (LFreshMT m)
-> (forall a. (a -> LFreshMT m a) -> LFreshMT m a)
-> MonadFix (LFreshMT m)
forall a. (a -> LFreshMT m a) -> LFreshMT m a
forall (m :: * -> *).
Monad m -> (forall a. (a -> m a) -> m a) -> MonadFix m
forall {m :: * -> *}. MonadFix m => Monad (LFreshMT m)
forall (m :: * -> *) a.
MonadFix m =>
(a -> LFreshMT m a) -> LFreshMT m a
mfix :: forall a. (a -> LFreshMT m a) -> LFreshMT m a
$cmfix :: forall (m :: * -> *) a.
MonadFix m =>
(a -> LFreshMT m a) -> LFreshMT m a
MonadFix
    , Monad (LFreshMT m)
Monad (LFreshMT m)
-> (forall e a. Exception e => e -> LFreshMT m a)
-> MonadThrow (LFreshMT m)
forall e a. Exception e => e -> LFreshMT m a
forall (m :: * -> *).
Monad m -> (forall e a. Exception e => e -> m a) -> MonadThrow m
forall {m :: * -> *}. MonadThrow m => Monad (LFreshMT m)
forall (m :: * -> *) e a.
(MonadThrow m, Exception e) =>
e -> LFreshMT m a
throwM :: forall e a. Exception e => e -> LFreshMT m a
$cthrowM :: forall (m :: * -> *) e a.
(MonadThrow m, Exception e) =>
e -> LFreshMT m a
MonadThrow
    , MonadThrow (LFreshMT m)
MonadThrow (LFreshMT m)
-> (forall e a.
    Exception e =>
    LFreshMT m a -> (e -> LFreshMT m a) -> LFreshMT m a)
-> MonadCatch (LFreshMT m)
forall e a.
Exception e =>
LFreshMT m a -> (e -> LFreshMT m a) -> LFreshMT m a
forall (m :: * -> *).
MonadThrow m
-> (forall e a. Exception e => m a -> (e -> m a) -> m a)
-> MonadCatch m
forall {m :: * -> *}. MonadCatch m => MonadThrow (LFreshMT m)
forall (m :: * -> *) e a.
(MonadCatch m, Exception e) =>
LFreshMT m a -> (e -> LFreshMT m a) -> LFreshMT m a
catch :: forall e a.
Exception e =>
LFreshMT m a -> (e -> LFreshMT m a) -> LFreshMT m a
$ccatch :: forall (m :: * -> *) e a.
(MonadCatch m, Exception e) =>
LFreshMT m a -> (e -> LFreshMT m a) -> LFreshMT m a
MonadCatch
    , MonadCatch (LFreshMT m)
MonadCatch (LFreshMT m)
-> (forall b.
    ((forall a. LFreshMT m a -> LFreshMT m a) -> LFreshMT m b)
    -> LFreshMT m b)
-> (forall b.
    ((forall a. LFreshMT m a -> LFreshMT m a) -> LFreshMT m b)
    -> LFreshMT m b)
-> (forall a b c.
    LFreshMT m a
    -> (a -> ExitCase b -> LFreshMT m c)
    -> (a -> LFreshMT m b)
    -> LFreshMT m (b, c))
-> MonadMask (LFreshMT m)
forall b.
((forall a. LFreshMT m a -> LFreshMT m a) -> LFreshMT m b)
-> LFreshMT m b
forall a b c.
LFreshMT m a
-> (a -> ExitCase b -> LFreshMT m c)
-> (a -> LFreshMT m b)
-> LFreshMT m (b, c)
forall (m :: * -> *).
MonadCatch m
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall a b c.
    m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c))
-> MonadMask m
forall {m :: * -> *}. MonadMask m => MonadCatch (LFreshMT m)
forall (m :: * -> *) b.
MonadMask m =>
((forall a. LFreshMT m a -> LFreshMT m a) -> LFreshMT m b)
-> LFreshMT m b
forall (m :: * -> *) a b c.
MonadMask m =>
LFreshMT m a
-> (a -> ExitCase b -> LFreshMT m c)
-> (a -> LFreshMT m b)
-> LFreshMT m (b, c)
generalBracket :: forall a b c.
LFreshMT m a
-> (a -> ExitCase b -> LFreshMT m c)
-> (a -> LFreshMT m b)
-> LFreshMT m (b, c)
$cgeneralBracket :: forall (m :: * -> *) a b c.
MonadMask m =>
LFreshMT m a
-> (a -> ExitCase b -> LFreshMT m c)
-> (a -> LFreshMT m b)
-> LFreshMT m (b, c)
uninterruptibleMask :: forall b.
((forall a. LFreshMT m a -> LFreshMT m a) -> LFreshMT m b)
-> LFreshMT m b
$cuninterruptibleMask :: forall (m :: * -> *) b.
MonadMask m =>
((forall a. LFreshMT m a -> LFreshMT m a) -> LFreshMT m b)
-> LFreshMT m b
mask :: forall b.
((forall a. LFreshMT m a -> LFreshMT m a) -> LFreshMT m b)
-> LFreshMT m b
$cmask :: forall (m :: * -> *) b.
MonadMask m =>
((forall a. LFreshMT m a -> LFreshMT m a) -> LFreshMT m b)
-> LFreshMT m b
MonadMask
    )
#if MIN_VERSION_base(4,9,0)
deriving instance Fail.MonadFail m => Fail.MonadFail (LFreshMT m)
#endif
runLFreshMT :: LFreshMT m a -> m a
runLFreshMT :: forall (m :: * -> *) a. LFreshMT m a -> m a
runLFreshMT LFreshMT m a
m = LFreshMT m a -> Set AnyName -> m a
forall (m :: * -> *) a. LFreshMT m a -> Set AnyName -> m a
contLFreshMT LFreshMT m a
m Set AnyName
forall a. Set a
S.empty
contLFreshMT :: LFreshMT m a -> Set AnyName -> m a
contLFreshMT :: forall (m :: * -> *) a. LFreshMT m a -> Set AnyName -> m a
contLFreshMT (LFreshMT ReaderT (Set AnyName) m a
m) = ReaderT (Set AnyName) m a -> Set AnyName -> m a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT (Set AnyName) m a
m
instance Monad m => LFresh (LFreshMT m) where
  lfresh :: forall a. Typeable a => Name a -> LFreshMT m (Name a)
lfresh Name a
nm = ReaderT (Set AnyName) m (Name a) -> LFreshMT m (Name a)
forall (m :: * -> *) a. ReaderT (Set AnyName) m a -> LFreshMT m a
LFreshMT (ReaderT (Set AnyName) m (Name a) -> LFreshMT m (Name a))
-> ReaderT (Set AnyName) m (Name a) -> LFreshMT m (Name a)
forall a b. (a -> b) -> a -> b
$ do
    let s :: String
s = Name a -> String
forall a. Name a -> String
name2String Name a
nm
    Set AnyName
used <- ReaderT (Set AnyName) m (Set AnyName)
forall r (m :: * -> *). MonadReader r m => m r
ask
    Name a -> ReaderT (Set AnyName) m (Name a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Name a -> ReaderT (Set AnyName) m (Name a))
-> Name a -> ReaderT (Set AnyName) m (Name a)
forall a b. (a -> b) -> a -> b
$ [Name a] -> Name a
forall a. [a] -> a
head ((Name a -> Bool) -> [Name a] -> [Name a]
forall a. (a -> Bool) -> [a] -> [a]
filter (\Name a
x -> Bool -> Bool
not (AnyName -> Set AnyName -> Bool
forall a. Ord a => a -> Set a -> Bool
S.member (Name a -> AnyName
forall a. Typeable a => Name a -> AnyName
AnyName Name a
x) Set AnyName
used))
                          ((Integer -> Name a) -> [Integer] -> [Name a]
forall a b. (a -> b) -> [a] -> [b]
map (String -> Integer -> Name a
forall a. String -> Integer -> Name a
makeName String
s) [Integer
0..]))
  avoid :: forall a. [AnyName] -> LFreshMT m a -> LFreshMT m a
avoid [AnyName]
names = ReaderT (Set AnyName) m a -> LFreshMT m a
forall (m :: * -> *) a. ReaderT (Set AnyName) m a -> LFreshMT m a
LFreshMT (ReaderT (Set AnyName) m a -> LFreshMT m a)
-> (LFreshMT m a -> ReaderT (Set AnyName) m a)
-> LFreshMT m a
-> LFreshMT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Set AnyName -> Set AnyName)
-> ReaderT (Set AnyName) m a -> ReaderT (Set AnyName) m a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local (Set AnyName -> Set AnyName -> Set AnyName
forall a. Ord a => Set a -> Set a -> Set a
S.union ([AnyName] -> Set AnyName
forall a. Ord a => [a] -> Set a
S.fromList [AnyName]
names)) (ReaderT (Set AnyName) m a -> ReaderT (Set AnyName) m a)
-> (LFreshMT m a -> ReaderT (Set AnyName) m a)
-> LFreshMT m a
-> ReaderT (Set AnyName) m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LFreshMT m a -> ReaderT (Set AnyName) m a
forall (m :: * -> *) a. LFreshMT m a -> ReaderT (Set AnyName) m a
unLFreshMT
  getAvoids :: LFreshMT m (Set AnyName)
getAvoids = ReaderT (Set AnyName) m (Set AnyName) -> LFreshMT m (Set AnyName)
forall (m :: * -> *) a. ReaderT (Set AnyName) m a -> LFreshMT m a
LFreshMT ReaderT (Set AnyName) m (Set AnyName)
forall r (m :: * -> *). MonadReader r m => m r
ask
type LFreshM = LFreshMT Identity
runLFreshM :: LFreshM a -> a
runLFreshM :: forall a. LFreshM a -> a
runLFreshM = Identity a -> a
forall a. Identity a -> a
runIdentity (Identity a -> a)
-> (LFreshMT Identity a -> Identity a) -> LFreshMT Identity a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LFreshMT Identity a -> Identity a
forall (m :: * -> *) a. LFreshMT m a -> m a
runLFreshMT
contLFreshM :: LFreshM a -> Set AnyName -> a
contLFreshM :: forall a. LFreshM a -> Set AnyName -> a
contLFreshM LFreshM a
m = Identity a -> a
forall a. Identity a -> a
runIdentity (Identity a -> a)
-> (Set AnyName -> Identity a) -> Set AnyName -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LFreshM a -> Set AnyName -> Identity a
forall (m :: * -> *) a. LFreshMT m a -> Set AnyName -> m a
contLFreshMT LFreshM a
m
instance LFresh m => LFresh (ContT r m) where
  lfresh :: forall a. Typeable a => Name a -> ContT r m (Name a)
lfresh = m (Name a) -> ContT r m (Name a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Name a) -> ContT r m (Name a))
-> (Name a -> m (Name a)) -> Name a -> ContT r m (Name a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name a -> m (Name a)
forall (m :: * -> *) a.
(LFresh m, Typeable a) =>
Name a -> m (Name a)
lfresh
  avoid :: forall a. [AnyName] -> ContT r m a -> ContT r m a
avoid  = (m r -> m r) -> ContT r m a -> ContT r m a
forall {k} (m :: k -> *) (r :: k) a.
(m r -> m r) -> ContT r m a -> ContT r m a
mapContT ((m r -> m r) -> ContT r m a -> ContT r m a)
-> ([AnyName] -> m r -> m r)
-> [AnyName]
-> ContT r m a
-> ContT r m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [AnyName] -> m r -> m r
forall (m :: * -> *) a. LFresh m => [AnyName] -> m a -> m a
avoid
  getAvoids :: ContT r m (Set AnyName)
getAvoids = m (Set AnyName) -> ContT r m (Set AnyName)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Set AnyName)
forall (m :: * -> *). LFresh m => m (Set AnyName)
getAvoids
instance (Error e, LFresh m) => LFresh (ErrorT e m) where
  lfresh :: forall a. Typeable a => Name a -> ErrorT e m (Name a)
lfresh = m (Name a) -> ErrorT e m (Name a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Name a) -> ErrorT e m (Name a))
-> (Name a -> m (Name a)) -> Name a -> ErrorT e m (Name a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name a -> m (Name a)
forall (m :: * -> *) a.
(LFresh m, Typeable a) =>
Name a -> m (Name a)
lfresh
  avoid :: forall a. [AnyName] -> ErrorT e m a -> ErrorT e m a
avoid  = (m (Either e a) -> m (Either e a)) -> ErrorT e m a -> ErrorT e m a
forall (m :: * -> *) e a (n :: * -> *) e' b.
(m (Either e a) -> n (Either e' b))
-> ErrorT e m a -> ErrorT e' n b
mapErrorT ((m (Either e a) -> m (Either e a))
 -> ErrorT e m a -> ErrorT e m a)
-> ([AnyName] -> m (Either e a) -> m (Either e a))
-> [AnyName]
-> ErrorT e m a
-> ErrorT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [AnyName] -> m (Either e a) -> m (Either e a)
forall (m :: * -> *) a. LFresh m => [AnyName] -> m a -> m a
avoid
  getAvoids :: ErrorT e m (Set AnyName)
getAvoids = m (Set AnyName) -> ErrorT e m (Set AnyName)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Set AnyName)
forall (m :: * -> *). LFresh m => m (Set AnyName)
getAvoids
instance LFresh m => LFresh (ExceptT e m) where
  lfresh :: forall a. Typeable a => Name a -> ExceptT e m (Name a)
lfresh = m (Name a) -> ExceptT e m (Name a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Name a) -> ExceptT e m (Name a))
-> (Name a -> m (Name a)) -> Name a -> ExceptT e m (Name a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name a -> m (Name a)
forall (m :: * -> *) a.
(LFresh m, Typeable a) =>
Name a -> m (Name a)
lfresh
  avoid :: forall a. [AnyName] -> ExceptT e m a -> ExceptT e m a
avoid = (m (Either e a) -> m (Either e a))
-> ExceptT e m a -> ExceptT e m a
forall (m :: * -> *) e a (n :: * -> *) e' b.
(m (Either e a) -> n (Either e' b))
-> ExceptT e m a -> ExceptT e' n b
mapExceptT ((m (Either e a) -> m (Either e a))
 -> ExceptT e m a -> ExceptT e m a)
-> ([AnyName] -> m (Either e a) -> m (Either e a))
-> [AnyName]
-> ExceptT e m a
-> ExceptT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [AnyName] -> m (Either e a) -> m (Either e a)
forall (m :: * -> *) a. LFresh m => [AnyName] -> m a -> m a
avoid
  getAvoids :: ExceptT e m (Set AnyName)
getAvoids = m (Set AnyName) -> ExceptT e m (Set AnyName)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Set AnyName)
forall (m :: * -> *). LFresh m => m (Set AnyName)
getAvoids
instance LFresh m => LFresh (IdentityT m) where
  lfresh :: forall a. Typeable a => Name a -> IdentityT m (Name a)
lfresh = m (Name a) -> IdentityT m (Name a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Name a) -> IdentityT m (Name a))
-> (Name a -> m (Name a)) -> Name a -> IdentityT m (Name a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name a -> m (Name a)
forall (m :: * -> *) a.
(LFresh m, Typeable a) =>
Name a -> m (Name a)
lfresh
  avoid :: forall a. [AnyName] -> IdentityT m a -> IdentityT m a
avoid  = (m a -> m a) -> IdentityT m a -> IdentityT m a
forall {k1} {k2} (m :: k1 -> *) (a :: k1) (n :: k2 -> *) (b :: k2).
(m a -> n b) -> IdentityT m a -> IdentityT n b
mapIdentityT ((m a -> m a) -> IdentityT m a -> IdentityT m a)
-> ([AnyName] -> m a -> m a)
-> [AnyName]
-> IdentityT m a
-> IdentityT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [AnyName] -> m a -> m a
forall (m :: * -> *) a. LFresh m => [AnyName] -> m a -> m a
avoid
  getAvoids :: IdentityT m (Set AnyName)
getAvoids = m (Set AnyName) -> IdentityT m (Set AnyName)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Set AnyName)
forall (m :: * -> *). LFresh m => m (Set AnyName)
getAvoids
instance LFresh m => LFresh (ListT m) where
  lfresh :: forall a. Typeable a => Name a -> ListT m (Name a)
lfresh = m (Name a) -> ListT m (Name a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Name a) -> ListT m (Name a))
-> (Name a -> m (Name a)) -> Name a -> ListT m (Name a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name a -> m (Name a)
forall (m :: * -> *) a.
(LFresh m, Typeable a) =>
Name a -> m (Name a)
lfresh
  avoid :: forall a. [AnyName] -> ListT m a -> ListT m a
avoid  = (m [a] -> m [a]) -> ListT m a -> ListT m a
forall (m :: * -> *) a (n :: * -> *) b.
(m [a] -> n [b]) -> ListT m a -> ListT n b
mapListT ((m [a] -> m [a]) -> ListT m a -> ListT m a)
-> ([AnyName] -> m [a] -> m [a])
-> [AnyName]
-> ListT m a
-> ListT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [AnyName] -> m [a] -> m [a]
forall (m :: * -> *) a. LFresh m => [AnyName] -> m a -> m a
avoid
  getAvoids :: ListT m (Set AnyName)
getAvoids = m (Set AnyName) -> ListT m (Set AnyName)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Set AnyName)
forall (m :: * -> *). LFresh m => m (Set AnyName)
getAvoids
instance LFresh m => LFresh (MaybeT m) where
  lfresh :: forall a. Typeable a => Name a -> MaybeT m (Name a)
lfresh = m (Name a) -> MaybeT m (Name a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Name a) -> MaybeT m (Name a))
-> (Name a -> m (Name a)) -> Name a -> MaybeT m (Name a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name a -> m (Name a)
forall (m :: * -> *) a.
(LFresh m, Typeable a) =>
Name a -> m (Name a)
lfresh
  avoid :: forall a. [AnyName] -> MaybeT m a -> MaybeT m a
avoid  = (m (Maybe a) -> m (Maybe a)) -> MaybeT m a -> MaybeT m a
forall (m :: * -> *) a (n :: * -> *) b.
(m (Maybe a) -> n (Maybe b)) -> MaybeT m a -> MaybeT n b
mapMaybeT ((m (Maybe a) -> m (Maybe a)) -> MaybeT m a -> MaybeT m a)
-> ([AnyName] -> m (Maybe a) -> m (Maybe a))
-> [AnyName]
-> MaybeT m a
-> MaybeT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [AnyName] -> m (Maybe a) -> m (Maybe a)
forall (m :: * -> *) a. LFresh m => [AnyName] -> m a -> m a
avoid
  getAvoids :: MaybeT m (Set AnyName)
getAvoids = m (Set AnyName) -> MaybeT m (Set AnyName)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Set AnyName)
forall (m :: * -> *). LFresh m => m (Set AnyName)
getAvoids
instance LFresh m => LFresh (ReaderT r m) where
  lfresh :: forall a. Typeable a => Name a -> ReaderT r m (Name a)
lfresh = m (Name a) -> ReaderT r m (Name a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Name a) -> ReaderT r m (Name a))
-> (Name a -> m (Name a)) -> Name a -> ReaderT r m (Name a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name a -> m (Name a)
forall (m :: * -> *) a.
(LFresh m, Typeable a) =>
Name a -> m (Name a)
lfresh
  avoid :: forall a. [AnyName] -> ReaderT r m a -> ReaderT r m a
avoid  = (m a -> m a) -> ReaderT r m a -> ReaderT r m a
forall (m :: * -> *) a (n :: * -> *) b r.
(m a -> n b) -> ReaderT r m a -> ReaderT r n b
mapReaderT ((m a -> m a) -> ReaderT r m a -> ReaderT r m a)
-> ([AnyName] -> m a -> m a)
-> [AnyName]
-> ReaderT r m a
-> ReaderT r m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [AnyName] -> m a -> m a
forall (m :: * -> *) a. LFresh m => [AnyName] -> m a -> m a
avoid
  getAvoids :: ReaderT r m (Set AnyName)
getAvoids = m (Set AnyName) -> ReaderT r m (Set AnyName)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Set AnyName)
forall (m :: * -> *). LFresh m => m (Set AnyName)
getAvoids
instance LFresh m => LFresh (Lazy.StateT s m) where
  lfresh :: forall a. Typeable a => Name a -> StateT s m (Name a)
lfresh = m (Name a) -> StateT s m (Name a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Name a) -> StateT s m (Name a))
-> (Name a -> m (Name a)) -> Name a -> StateT s m (Name a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name a -> m (Name a)
forall (m :: * -> *) a.
(LFresh m, Typeable a) =>
Name a -> m (Name a)
lfresh
  avoid :: forall a. [AnyName] -> StateT s m a -> StateT s m a
avoid  = (m (a, s) -> m (a, s)) -> StateT s m a -> StateT s m a
forall (m :: * -> *) a s (n :: * -> *) b.
(m (a, s) -> n (b, s)) -> StateT s m a -> StateT s n b
Lazy.mapStateT ((m (a, s) -> m (a, s)) -> StateT s m a -> StateT s m a)
-> ([AnyName] -> m (a, s) -> m (a, s))
-> [AnyName]
-> StateT s m a
-> StateT s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [AnyName] -> m (a, s) -> m (a, s)
forall (m :: * -> *) a. LFresh m => [AnyName] -> m a -> m a
avoid
  getAvoids :: StateT s m (Set AnyName)
getAvoids = m (Set AnyName) -> StateT s m (Set AnyName)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Set AnyName)
forall (m :: * -> *). LFresh m => m (Set AnyName)
getAvoids
instance LFresh m => LFresh (Strict.StateT s m) where
  lfresh :: forall a. Typeable a => Name a -> StateT s m (Name a)
lfresh = m (Name a) -> StateT s m (Name a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Name a) -> StateT s m (Name a))
-> (Name a -> m (Name a)) -> Name a -> StateT s m (Name a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name a -> m (Name a)
forall (m :: * -> *) a.
(LFresh m, Typeable a) =>
Name a -> m (Name a)
lfresh
  avoid :: forall a. [AnyName] -> StateT s m a -> StateT s m a
avoid  = (m (a, s) -> m (a, s)) -> StateT s m a -> StateT s m a
forall (m :: * -> *) a s (n :: * -> *) b.
(m (a, s) -> n (b, s)) -> StateT s m a -> StateT s n b
Strict.mapStateT ((m (a, s) -> m (a, s)) -> StateT s m a -> StateT s m a)
-> ([AnyName] -> m (a, s) -> m (a, s))
-> [AnyName]
-> StateT s m a
-> StateT s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [AnyName] -> m (a, s) -> m (a, s)
forall (m :: * -> *) a. LFresh m => [AnyName] -> m a -> m a
avoid
  getAvoids :: StateT s m (Set AnyName)
getAvoids = m (Set AnyName) -> StateT s m (Set AnyName)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Set AnyName)
forall (m :: * -> *). LFresh m => m (Set AnyName)
getAvoids
instance (Monoid w, LFresh m) => LFresh (Lazy.WriterT w m) where
  lfresh :: forall a. Typeable a => Name a -> WriterT w m (Name a)
lfresh = m (Name a) -> WriterT w m (Name a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Name a) -> WriterT w m (Name a))
-> (Name a -> m (Name a)) -> Name a -> WriterT w m (Name a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name a -> m (Name a)
forall (m :: * -> *) a.
(LFresh m, Typeable a) =>
Name a -> m (Name a)
lfresh
  avoid :: forall a. [AnyName] -> WriterT w m a -> WriterT w m a
avoid  = (m (a, w) -> m (a, w)) -> WriterT w m a -> WriterT w m a
forall (m :: * -> *) a w (n :: * -> *) b w'.
(m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b
Lazy.mapWriterT ((m (a, w) -> m (a, w)) -> WriterT w m a -> WriterT w m a)
-> ([AnyName] -> m (a, w) -> m (a, w))
-> [AnyName]
-> WriterT w m a
-> WriterT w m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [AnyName] -> m (a, w) -> m (a, w)
forall (m :: * -> *) a. LFresh m => [AnyName] -> m a -> m a
avoid
  getAvoids :: WriterT w m (Set AnyName)
getAvoids = m (Set AnyName) -> WriterT w m (Set AnyName)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Set AnyName)
forall (m :: * -> *). LFresh m => m (Set AnyName)
getAvoids
instance (Monoid w, LFresh m) => LFresh (Strict.WriterT w m) where
  lfresh :: forall a. Typeable a => Name a -> WriterT w m (Name a)
lfresh = m (Name a) -> WriterT w m (Name a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Name a) -> WriterT w m (Name a))
-> (Name a -> m (Name a)) -> Name a -> WriterT w m (Name a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name a -> m (Name a)
forall (m :: * -> *) a.
(LFresh m, Typeable a) =>
Name a -> m (Name a)
lfresh
  avoid :: forall a. [AnyName] -> WriterT w m a -> WriterT w m a
avoid  = (m (a, w) -> m (a, w)) -> WriterT w m a -> WriterT w m a
forall (m :: * -> *) a w (n :: * -> *) b w'.
(m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b
Strict.mapWriterT ((m (a, w) -> m (a, w)) -> WriterT w m a -> WriterT w m a)
-> ([AnyName] -> m (a, w) -> m (a, w))
-> [AnyName]
-> WriterT w m a
-> WriterT w m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [AnyName] -> m (a, w) -> m (a, w)
forall (m :: * -> *) a. LFresh m => [AnyName] -> m a -> m a
avoid
  getAvoids :: WriterT w m (Set AnyName)
getAvoids = m (Set AnyName) -> WriterT w m (Set AnyName)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Set AnyName)
forall (m :: * -> *). LFresh m => m (Set AnyName)
getAvoids
instance MonadTrans LFreshMT where
  lift :: forall (m :: * -> *) a. Monad m => m a -> LFreshMT m a
lift = ReaderT (Set AnyName) m a -> LFreshMT m a
forall (m :: * -> *) a. ReaderT (Set AnyName) m a -> LFreshMT m a
LFreshMT (ReaderT (Set AnyName) m a -> LFreshMT m a)
-> (m a -> ReaderT (Set AnyName) m a) -> m a -> LFreshMT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m a -> ReaderT (Set AnyName) m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift
instance CC.MonadCont m => CC.MonadCont (LFreshMT m) where
  callCC :: forall a b. ((a -> LFreshMT m b) -> LFreshMT m a) -> LFreshMT m a
callCC (a -> LFreshMT m b) -> LFreshMT m a
c = ReaderT (Set AnyName) m a -> LFreshMT m a
forall (m :: * -> *) a. ReaderT (Set AnyName) m a -> LFreshMT m a
LFreshMT (ReaderT (Set AnyName) m a -> LFreshMT m a)
-> ReaderT (Set AnyName) m a -> LFreshMT m a
forall a b. (a -> b) -> a -> b
$ ((a -> ReaderT (Set AnyName) m b) -> ReaderT (Set AnyName) m a)
-> ReaderT (Set AnyName) m a
forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
CC.callCC (LFreshMT m a -> ReaderT (Set AnyName) m a
forall (m :: * -> *) a. LFreshMT m a -> ReaderT (Set AnyName) m a
unLFreshMT (LFreshMT m a -> ReaderT (Set AnyName) m a)
-> ((a -> ReaderT (Set AnyName) m b) -> LFreshMT m a)
-> (a -> ReaderT (Set AnyName) m b)
-> ReaderT (Set AnyName) m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (\a -> ReaderT (Set AnyName) m b
k -> (a -> LFreshMT m b) -> LFreshMT m a
c (ReaderT (Set AnyName) m b -> LFreshMT m b
forall (m :: * -> *) a. ReaderT (Set AnyName) m a -> LFreshMT m a
LFreshMT (ReaderT (Set AnyName) m b -> LFreshMT m b)
-> (a -> ReaderT (Set AnyName) m b) -> a -> LFreshMT m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> ReaderT (Set AnyName) m b
k)))
instance EC.MonadError e m => EC.MonadError e (LFreshMT m) where
  throwError :: forall a. e -> LFreshMT m a
throwError = m a -> LFreshMT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> LFreshMT m a) -> (e -> m a) -> e -> LFreshMT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
EC.throwError
  catchError :: forall a. LFreshMT m a -> (e -> LFreshMT m a) -> LFreshMT m a
catchError LFreshMT m a
m e -> LFreshMT m a
h = ReaderT (Set AnyName) m a -> LFreshMT m a
forall (m :: * -> *) a. ReaderT (Set AnyName) m a -> LFreshMT m a
LFreshMT (ReaderT (Set AnyName) m a -> LFreshMT m a)
-> ReaderT (Set AnyName) m a -> LFreshMT m a
forall a b. (a -> b) -> a -> b
$ ReaderT (Set AnyName) m a
-> (e -> ReaderT (Set AnyName) m a) -> ReaderT (Set AnyName) m a
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
EC.catchError (LFreshMT m a -> ReaderT (Set AnyName) m a
forall (m :: * -> *) a. LFreshMT m a -> ReaderT (Set AnyName) m a
unLFreshMT LFreshMT m a
m) (LFreshMT m a -> ReaderT (Set AnyName) m a
forall (m :: * -> *) a. LFreshMT m a -> ReaderT (Set AnyName) m a
unLFreshMT (LFreshMT m a -> ReaderT (Set AnyName) m a)
-> (e -> LFreshMT m a) -> e -> ReaderT (Set AnyName) m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> LFreshMT m a
h)
instance StC.MonadState s m => StC.MonadState s (LFreshMT m) where
  get :: LFreshMT m s
get = m s -> LFreshMT m s
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m s
forall s (m :: * -> *). MonadState s m => m s
StC.get
  put :: s -> LFreshMT m ()
put = m () -> LFreshMT m ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> LFreshMT m ()) -> (s -> m ()) -> s -> LFreshMT m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> m ()
forall s (m :: * -> *). MonadState s m => s -> m ()
StC.put
instance RC.MonadReader r m => RC.MonadReader r (LFreshMT m) where
  ask :: LFreshMT m r
ask   = m r -> LFreshMT m r
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m r
forall r (m :: * -> *). MonadReader r m => m r
RC.ask
  local :: forall a. (r -> r) -> LFreshMT m a -> LFreshMT m a
local r -> r
f = ReaderT (Set AnyName) m a -> LFreshMT m a
forall (m :: * -> *) a. ReaderT (Set AnyName) m a -> LFreshMT m a
LFreshMT (ReaderT (Set AnyName) m a -> LFreshMT m a)
-> (LFreshMT m a -> ReaderT (Set AnyName) m a)
-> LFreshMT m a
-> LFreshMT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (m a -> m a)
-> ReaderT (Set AnyName) m a -> ReaderT (Set AnyName) m a
forall (m :: * -> *) a (n :: * -> *) b r.
(m a -> n b) -> ReaderT r m a -> ReaderT r n b
mapReaderT ((r -> r) -> m a -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
RC.local r -> r
f) (ReaderT (Set AnyName) m a -> ReaderT (Set AnyName) m a)
-> (LFreshMT m a -> ReaderT (Set AnyName) m a)
-> LFreshMT m a
-> ReaderT (Set AnyName) m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LFreshMT m a -> ReaderT (Set AnyName) m a
forall (m :: * -> *) a. LFreshMT m a -> ReaderT (Set AnyName) m a
unLFreshMT
instance WC.MonadWriter w m => WC.MonadWriter w (LFreshMT m) where
  tell :: w -> LFreshMT m ()
tell   = m () -> LFreshMT m ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> LFreshMT m ()) -> (w -> m ()) -> w -> LFreshMT m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. w -> m ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
WC.tell
  listen :: forall a. LFreshMT m a -> LFreshMT m (a, w)
listen = ReaderT (Set AnyName) m (a, w) -> LFreshMT m (a, w)
forall (m :: * -> *) a. ReaderT (Set AnyName) m a -> LFreshMT m a
LFreshMT (ReaderT (Set AnyName) m (a, w) -> LFreshMT m (a, w))
-> (LFreshMT m a -> ReaderT (Set AnyName) m (a, w))
-> LFreshMT m a
-> LFreshMT m (a, w)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReaderT (Set AnyName) m a -> ReaderT (Set AnyName) m (a, w)
forall w (m :: * -> *) a. MonadWriter w m => m a -> m (a, w)
WC.listen (ReaderT (Set AnyName) m a -> ReaderT (Set AnyName) m (a, w))
-> (LFreshMT m a -> ReaderT (Set AnyName) m a)
-> LFreshMT m a
-> ReaderT (Set AnyName) m (a, w)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LFreshMT m a -> ReaderT (Set AnyName) m a
forall (m :: * -> *) a. LFreshMT m a -> ReaderT (Set AnyName) m a
unLFreshMT
  pass :: forall a. LFreshMT m (a, w -> w) -> LFreshMT m a
pass   = ReaderT (Set AnyName) m a -> LFreshMT m a
forall (m :: * -> *) a. ReaderT (Set AnyName) m a -> LFreshMT m a
LFreshMT (ReaderT (Set AnyName) m a -> LFreshMT m a)
-> (LFreshMT m (a, w -> w) -> ReaderT (Set AnyName) m a)
-> LFreshMT m (a, w -> w)
-> LFreshMT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReaderT (Set AnyName) m (a, w -> w) -> ReaderT (Set AnyName) m a
forall w (m :: * -> *) a. MonadWriter w m => m (a, w -> w) -> m a
WC.pass (ReaderT (Set AnyName) m (a, w -> w) -> ReaderT (Set AnyName) m a)
-> (LFreshMT m (a, w -> w) -> ReaderT (Set AnyName) m (a, w -> w))
-> LFreshMT m (a, w -> w)
-> ReaderT (Set AnyName) m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LFreshMT m (a, w -> w) -> ReaderT (Set AnyName) m (a, w -> w)
forall (m :: * -> *) a. LFreshMT m a -> ReaderT (Set AnyName) m a
unLFreshMT