{-# language CPP #-} {-# language GeneralizedNewtypeDeriving #-} {-# language TypeFamilies #-} {-# language UndecidableInstances #-} {-# options_ghc -Wno-orphans #-} module Nix.Fresh where import Nix.Prelude import Control.Monad.Base ( MonadBase(..) ) import Control.Monad.Catch ( MonadCatch , MonadMask , MonadThrow ) import Control.Monad.Fix ( MonadFix ) import Control.Monad.Ref ( MonadAtomicRef(..) , MonadRef(Ref) ) import Nix.Thunk newtype FreshIdT i m a = FreshIdT (ReaderT (Ref m i) m a) deriving ( (forall a b. (a -> b) -> FreshIdT i m a -> FreshIdT i m b) -> (forall a b. a -> FreshIdT i m b -> FreshIdT i m a) -> Functor (FreshIdT i m) forall a b. a -> FreshIdT i m b -> FreshIdT i m a forall a b. (a -> b) -> FreshIdT i m a -> FreshIdT i m b forall i (m :: * -> *) a b. Functor m => a -> FreshIdT i m b -> FreshIdT i m a forall i (m :: * -> *) a b. Functor m => (a -> b) -> FreshIdT i m a -> FreshIdT i m b forall (f :: * -> *). (forall a b. (a -> b) -> f a -> f b) -> (forall a b. a -> f b -> f a) -> Functor f $cfmap :: forall i (m :: * -> *) a b. Functor m => (a -> b) -> FreshIdT i m a -> FreshIdT i m b fmap :: forall a b. (a -> b) -> FreshIdT i m a -> FreshIdT i m b $c<$ :: forall i (m :: * -> *) a b. Functor m => a -> FreshIdT i m b -> FreshIdT i m a <$ :: forall a b. a -> FreshIdT i m b -> FreshIdT i m a Functor , Functor (FreshIdT i m) Functor (FreshIdT i m) => (forall a. a -> FreshIdT i m a) -> (forall a b. FreshIdT i m (a -> b) -> FreshIdT i m a -> FreshIdT i m b) -> (forall a b c. (a -> b -> c) -> FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m c) -> (forall a b. FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m b) -> (forall a b. FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m a) -> Applicative (FreshIdT i m) forall a. a -> FreshIdT i m a forall a b. FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m a forall a b. FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m b forall a b. FreshIdT i m (a -> b) -> FreshIdT i m a -> FreshIdT i m b forall a b c. (a -> b -> c) -> FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m c forall i (m :: * -> *). Applicative m => Functor (FreshIdT i m) forall i (m :: * -> *) a. Applicative m => a -> FreshIdT i m a forall i (m :: * -> *) a b. Applicative m => FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m a forall i (m :: * -> *) a b. Applicative m => FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m b forall i (m :: * -> *) a b. Applicative m => FreshIdT i m (a -> b) -> FreshIdT i m a -> FreshIdT i m b forall i (m :: * -> *) a b c. Applicative m => (a -> b -> c) -> FreshIdT i m a -> FreshIdT i m b -> FreshIdT i 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 $cpure :: forall i (m :: * -> *) a. Applicative m => a -> FreshIdT i m a pure :: forall a. a -> FreshIdT i m a $c<*> :: forall i (m :: * -> *) a b. Applicative m => FreshIdT i m (a -> b) -> FreshIdT i m a -> FreshIdT i m b <*> :: forall a b. FreshIdT i m (a -> b) -> FreshIdT i m a -> FreshIdT i m b $cliftA2 :: forall i (m :: * -> *) a b c. Applicative m => (a -> b -> c) -> FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m c liftA2 :: forall a b c. (a -> b -> c) -> FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m c $c*> :: forall i (m :: * -> *) a b. Applicative m => FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m b *> :: forall a b. FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m b $c<* :: forall i (m :: * -> *) a b. Applicative m => FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m a <* :: forall a b. FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m a Applicative , Applicative (FreshIdT i m) Applicative (FreshIdT i m) => (forall a. FreshIdT i m a) -> (forall a. FreshIdT i m a -> FreshIdT i m a -> FreshIdT i m a) -> (forall a. FreshIdT i m a -> FreshIdT i m [a]) -> (forall a. FreshIdT i m a -> FreshIdT i m [a]) -> Alternative (FreshIdT i m) forall a. FreshIdT i m a forall a. FreshIdT i m a -> FreshIdT i m [a] forall a. FreshIdT i m a -> FreshIdT i m a -> FreshIdT i m a forall i (m :: * -> *). Alternative m => Applicative (FreshIdT i m) forall i (m :: * -> *) a. Alternative m => FreshIdT i m a forall i (m :: * -> *) a. Alternative m => FreshIdT i m a -> FreshIdT i m [a] forall i (m :: * -> *) a. Alternative m => FreshIdT i m a -> FreshIdT i m a -> FreshIdT i 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 $cempty :: forall i (m :: * -> *) a. Alternative m => FreshIdT i m a empty :: forall a. FreshIdT i m a $c<|> :: forall i (m :: * -> *) a. Alternative m => FreshIdT i m a -> FreshIdT i m a -> FreshIdT i m a <|> :: forall a. FreshIdT i m a -> FreshIdT i m a -> FreshIdT i m a $csome :: forall i (m :: * -> *) a. Alternative m => FreshIdT i m a -> FreshIdT i m [a] some :: forall a. FreshIdT i m a -> FreshIdT i m [a] $cmany :: forall i (m :: * -> *) a. Alternative m => FreshIdT i m a -> FreshIdT i m [a] many :: forall a. FreshIdT i m a -> FreshIdT i m [a] Alternative , Applicative (FreshIdT i m) Applicative (FreshIdT i m) => (forall a b. FreshIdT i m a -> (a -> FreshIdT i m b) -> FreshIdT i m b) -> (forall a b. FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m b) -> (forall a. a -> FreshIdT i m a) -> Monad (FreshIdT i m) forall a. a -> FreshIdT i m a forall a b. FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m b forall a b. FreshIdT i m a -> (a -> FreshIdT i m b) -> FreshIdT i m b forall i (m :: * -> *). Monad m => Applicative (FreshIdT i m) forall i (m :: * -> *) a. Monad m => a -> FreshIdT i m a forall i (m :: * -> *) a b. Monad m => FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m b forall i (m :: * -> *) a b. Monad m => FreshIdT i m a -> (a -> FreshIdT i m b) -> FreshIdT i 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 $c>>= :: forall i (m :: * -> *) a b. Monad m => FreshIdT i m a -> (a -> FreshIdT i m b) -> FreshIdT i m b >>= :: forall a b. FreshIdT i m a -> (a -> FreshIdT i m b) -> FreshIdT i m b $c>> :: forall i (m :: * -> *) a b. Monad m => FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m b >> :: forall a b. FreshIdT i m a -> FreshIdT i m b -> FreshIdT i m b $creturn :: forall i (m :: * -> *) a. Monad m => a -> FreshIdT i m a return :: forall a. a -> FreshIdT i m a Monad , Monad (FreshIdT i m) Monad (FreshIdT i m) => (forall a. String -> FreshIdT i m a) -> MonadFail (FreshIdT i m) forall a. String -> FreshIdT i m a forall i (m :: * -> *). MonadFail m => Monad (FreshIdT i m) forall i (m :: * -> *) a. MonadFail m => String -> FreshIdT i m a forall (m :: * -> *). Monad m => (forall a. String -> m a) -> MonadFail m $cfail :: forall i (m :: * -> *) a. MonadFail m => String -> FreshIdT i m a fail :: forall a. String -> FreshIdT i m a MonadFail , Monad (FreshIdT i m) Alternative (FreshIdT i m) (Alternative (FreshIdT i m), Monad (FreshIdT i m)) => (forall a. FreshIdT i m a) -> (forall a. FreshIdT i m a -> FreshIdT i m a -> FreshIdT i m a) -> MonadPlus (FreshIdT i m) forall a. FreshIdT i m a forall a. FreshIdT i m a -> FreshIdT i m a -> FreshIdT i m a forall i (m :: * -> *). MonadPlus m => Monad (FreshIdT i m) forall i (m :: * -> *). MonadPlus m => Alternative (FreshIdT i m) forall i (m :: * -> *) a. MonadPlus m => FreshIdT i m a forall i (m :: * -> *) a. MonadPlus m => FreshIdT i m a -> FreshIdT i m a -> FreshIdT i m a forall (m :: * -> *). (Alternative m, Monad m) => (forall a. m a) -> (forall a. m a -> m a -> m a) -> MonadPlus m $cmzero :: forall i (m :: * -> *) a. MonadPlus m => FreshIdT i m a mzero :: forall a. FreshIdT i m a $cmplus :: forall i (m :: * -> *) a. MonadPlus m => FreshIdT i m a -> FreshIdT i m a -> FreshIdT i m a mplus :: forall a. FreshIdT i m a -> FreshIdT i m a -> FreshIdT i m a MonadPlus , Monad (FreshIdT i m) Monad (FreshIdT i m) => (forall a. (a -> FreshIdT i m a) -> FreshIdT i m a) -> MonadFix (FreshIdT i m) forall a. (a -> FreshIdT i m a) -> FreshIdT i m a forall i (m :: * -> *). MonadFix m => Monad (FreshIdT i m) forall i (m :: * -> *) a. MonadFix m => (a -> FreshIdT i m a) -> FreshIdT i m a forall (m :: * -> *). Monad m => (forall a. (a -> m a) -> m a) -> MonadFix m $cmfix :: forall i (m :: * -> *) a. MonadFix m => (a -> FreshIdT i m a) -> FreshIdT i m a mfix :: forall a. (a -> FreshIdT i m a) -> FreshIdT i m a MonadFix , Monad (FreshIdT i m) Monad (FreshIdT i m) => (forall a. a -> FreshIdT i m (Ref (FreshIdT i m) a)) -> (forall a. Ref (FreshIdT i m) a -> FreshIdT i m a) -> (forall a. Ref (FreshIdT i m) a -> a -> FreshIdT i m ()) -> (forall a. Ref (FreshIdT i m) a -> (a -> a) -> FreshIdT i m ()) -> (forall a. Ref (FreshIdT i m) a -> (a -> a) -> FreshIdT i m ()) -> MonadRef (FreshIdT i m) forall a. a -> FreshIdT i m (Ref (FreshIdT i m) a) forall a. Ref (FreshIdT i m) a -> FreshIdT i m a forall a. Ref (FreshIdT i m) a -> a -> FreshIdT i m () forall a. Ref (FreshIdT i m) a -> (a -> a) -> FreshIdT i m () forall i (m :: * -> *). MonadRef m => Monad (FreshIdT i m) forall i (m :: * -> *) a. MonadRef m => a -> FreshIdT i m (Ref (FreshIdT i m) a) forall i (m :: * -> *) a. MonadRef m => Ref (FreshIdT i m) a -> FreshIdT i m a forall i (m :: * -> *) a. MonadRef m => Ref (FreshIdT i m) a -> a -> FreshIdT i m () forall i (m :: * -> *) a. MonadRef m => Ref (FreshIdT i m) a -> (a -> a) -> FreshIdT i m () forall (m :: * -> *). Monad m => (forall a. a -> m (Ref m a)) -> (forall a. Ref m a -> m a) -> (forall a. Ref m a -> a -> m ()) -> (forall a. Ref m a -> (a -> a) -> m ()) -> (forall a. Ref m a -> (a -> a) -> m ()) -> MonadRef m $cnewRef :: forall i (m :: * -> *) a. MonadRef m => a -> FreshIdT i m (Ref (FreshIdT i m) a) newRef :: forall a. a -> FreshIdT i m (Ref (FreshIdT i m) a) $creadRef :: forall i (m :: * -> *) a. MonadRef m => Ref (FreshIdT i m) a -> FreshIdT i m a readRef :: forall a. Ref (FreshIdT i m) a -> FreshIdT i m a $cwriteRef :: forall i (m :: * -> *) a. MonadRef m => Ref (FreshIdT i m) a -> a -> FreshIdT i m () writeRef :: forall a. Ref (FreshIdT i m) a -> a -> FreshIdT i m () $cmodifyRef :: forall i (m :: * -> *) a. MonadRef m => Ref (FreshIdT i m) a -> (a -> a) -> FreshIdT i m () modifyRef :: forall a. Ref (FreshIdT i m) a -> (a -> a) -> FreshIdT i m () $cmodifyRef' :: forall i (m :: * -> *) a. MonadRef m => Ref (FreshIdT i m) a -> (a -> a) -> FreshIdT i m () modifyRef' :: forall a. Ref (FreshIdT i m) a -> (a -> a) -> FreshIdT i m () MonadRef , MonadRef (FreshIdT i m) MonadRef (FreshIdT i m) => (forall a b. Ref (FreshIdT i m) a -> (a -> (a, b)) -> FreshIdT i m b) -> (forall a b. Ref (FreshIdT i m) a -> (a -> (a, b)) -> FreshIdT i m b) -> MonadAtomicRef (FreshIdT i m) forall a b. Ref (FreshIdT i m) a -> (a -> (a, b)) -> FreshIdT i m b forall i (m :: * -> *). MonadAtomicRef m => MonadRef (FreshIdT i m) forall i (m :: * -> *) a b. MonadAtomicRef m => Ref (FreshIdT i m) a -> (a -> (a, b)) -> FreshIdT i m b forall (m :: * -> *). MonadRef m => (forall a b. Ref m a -> (a -> (a, b)) -> m b) -> (forall a b. Ref m a -> (a -> (a, b)) -> m b) -> MonadAtomicRef m $catomicModifyRef :: forall i (m :: * -> *) a b. MonadAtomicRef m => Ref (FreshIdT i m) a -> (a -> (a, b)) -> FreshIdT i m b atomicModifyRef :: forall a b. Ref (FreshIdT i m) a -> (a -> (a, b)) -> FreshIdT i m b $catomicModifyRef' :: forall i (m :: * -> *) a b. MonadAtomicRef m => Ref (FreshIdT i m) a -> (a -> (a, b)) -> FreshIdT i m b atomicModifyRef' :: forall a b. Ref (FreshIdT i m) a -> (a -> (a, b)) -> FreshIdT i m b MonadAtomicRef , Monad (FreshIdT i m) Monad (FreshIdT i m) => (forall a. IO a -> FreshIdT i m a) -> MonadIO (FreshIdT i m) forall a. IO a -> FreshIdT i m a forall i (m :: * -> *). MonadIO m => Monad (FreshIdT i m) forall i (m :: * -> *) a. MonadIO m => IO a -> FreshIdT i m a forall (m :: * -> *). Monad m => (forall a. IO a -> m a) -> MonadIO m $cliftIO :: forall i (m :: * -> *) a. MonadIO m => IO a -> FreshIdT i m a liftIO :: forall a. IO a -> FreshIdT i m a MonadIO , MonadThrow (FreshIdT i m) MonadThrow (FreshIdT i m) => (forall e a. (HasCallStack, Exception e) => FreshIdT i m a -> (e -> FreshIdT i m a) -> FreshIdT i m a) -> MonadCatch (FreshIdT i m) forall e a. (HasCallStack, Exception e) => FreshIdT i m a -> (e -> FreshIdT i m a) -> FreshIdT i m a forall i (m :: * -> *). MonadCatch m => MonadThrow (FreshIdT i m) forall i (m :: * -> *) e a. (MonadCatch m, HasCallStack, Exception e) => FreshIdT i m a -> (e -> FreshIdT i m a) -> FreshIdT i m a forall (m :: * -> *). MonadThrow m => (forall e a. (HasCallStack, Exception e) => m a -> (e -> m a) -> m a) -> MonadCatch m $ccatch :: forall i (m :: * -> *) e a. (MonadCatch m, HasCallStack, Exception e) => FreshIdT i m a -> (e -> FreshIdT i m a) -> FreshIdT i m a catch :: forall e a. (HasCallStack, Exception e) => FreshIdT i m a -> (e -> FreshIdT i m a) -> FreshIdT i m a MonadCatch , Monad (FreshIdT i m) Monad (FreshIdT i m) => (forall e a. (HasCallStack, Exception e) => e -> FreshIdT i m a) -> MonadThrow (FreshIdT i m) forall e a. (HasCallStack, Exception e) => e -> FreshIdT i m a forall i (m :: * -> *). MonadThrow m => Monad (FreshIdT i m) forall i (m :: * -> *) e a. (MonadThrow m, HasCallStack, Exception e) => e -> FreshIdT i m a forall (m :: * -> *). Monad m => (forall e a. (HasCallStack, Exception e) => e -> m a) -> MonadThrow m $cthrowM :: forall i (m :: * -> *) e a. (MonadThrow m, HasCallStack, Exception e) => e -> FreshIdT i m a throwM :: forall e a. (HasCallStack, Exception e) => e -> FreshIdT i m a MonadThrow , MonadCatch (FreshIdT i m) MonadCatch (FreshIdT i m) => (forall b. HasCallStack => ((forall a. FreshIdT i m a -> FreshIdT i m a) -> FreshIdT i m b) -> FreshIdT i m b) -> (forall b. HasCallStack => ((forall a. FreshIdT i m a -> FreshIdT i m a) -> FreshIdT i m b) -> FreshIdT i m b) -> (forall a b c. HasCallStack => FreshIdT i m a -> (a -> ExitCase b -> FreshIdT i m c) -> (a -> FreshIdT i m b) -> FreshIdT i m (b, c)) -> MonadMask (FreshIdT i m) forall b. HasCallStack => ((forall a. FreshIdT i m a -> FreshIdT i m a) -> FreshIdT i m b) -> FreshIdT i m b forall a b c. HasCallStack => FreshIdT i m a -> (a -> ExitCase b -> FreshIdT i m c) -> (a -> FreshIdT i m b) -> FreshIdT i m (b, c) forall i (m :: * -> *). MonadMask m => MonadCatch (FreshIdT i m) forall i (m :: * -> *) b. (MonadMask m, HasCallStack) => ((forall a. FreshIdT i m a -> FreshIdT i m a) -> FreshIdT i m b) -> FreshIdT i m b forall i (m :: * -> *) a b c. (MonadMask m, HasCallStack) => FreshIdT i m a -> (a -> ExitCase b -> FreshIdT i m c) -> (a -> FreshIdT i m b) -> FreshIdT i m (b, c) forall (m :: * -> *). MonadCatch m => (forall b. HasCallStack => ((forall a. m a -> m a) -> m b) -> m b) -> (forall b. HasCallStack => ((forall a. m a -> m a) -> m b) -> m b) -> (forall a b c. HasCallStack => m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c)) -> MonadMask m $cmask :: forall i (m :: * -> *) b. (MonadMask m, HasCallStack) => ((forall a. FreshIdT i m a -> FreshIdT i m a) -> FreshIdT i m b) -> FreshIdT i m b mask :: forall b. HasCallStack => ((forall a. FreshIdT i m a -> FreshIdT i m a) -> FreshIdT i m b) -> FreshIdT i m b $cuninterruptibleMask :: forall i (m :: * -> *) b. (MonadMask m, HasCallStack) => ((forall a. FreshIdT i m a -> FreshIdT i m a) -> FreshIdT i m b) -> FreshIdT i m b uninterruptibleMask :: forall b. HasCallStack => ((forall a. FreshIdT i m a -> FreshIdT i m a) -> FreshIdT i m b) -> FreshIdT i m b $cgeneralBracket :: forall i (m :: * -> *) a b c. (MonadMask m, HasCallStack) => FreshIdT i m a -> (a -> ExitCase b -> FreshIdT i m c) -> (a -> FreshIdT i m b) -> FreshIdT i m (b, c) generalBracket :: forall a b c. HasCallStack => FreshIdT i m a -> (a -> ExitCase b -> FreshIdT i m c) -> (a -> FreshIdT i m b) -> FreshIdT i m (b, c) MonadMask ) instance MonadTrans (FreshIdT i) where lift :: forall (m :: * -> *) a. Monad m => m a -> FreshIdT i m a lift = ReaderT (Ref m i) m a -> FreshIdT i m a forall i (m :: * -> *) a. ReaderT (Ref m i) m a -> FreshIdT i m a FreshIdT (ReaderT (Ref m i) m a -> FreshIdT i m a) -> (m a -> ReaderT (Ref m i) m a) -> m a -> FreshIdT i m a forall b c a. (b -> c) -> (a -> b) -> a -> c . m a -> ReaderT (Ref m i) m a forall (m :: * -> *) a. Monad m => m a -> ReaderT (Ref m i) m a forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift instance MonadBase b m => MonadBase b (FreshIdT i m) where liftBase :: forall α. b α -> FreshIdT i m α liftBase = ReaderT (Ref m i) m α -> FreshIdT i m α forall i (m :: * -> *) a. ReaderT (Ref m i) m a -> FreshIdT i m a FreshIdT (ReaderT (Ref m i) m α -> FreshIdT i m α) -> (b α -> ReaderT (Ref m i) m α) -> b α -> FreshIdT i m α forall b c a. (b -> c) -> (a -> b) -> a -> c . b α -> ReaderT (Ref m i) m α forall α. b α -> ReaderT (Ref m i) m α forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α liftBase instance ( MonadAtomicRef m , Eq i , Ord i , Show i , Enum i , Typeable i ) => MonadThunkId (FreshIdT i m) where type ThunkId (FreshIdT i m) = i freshId :: FreshIdT i m (ThunkId (FreshIdT i m)) freshId = ReaderT (Ref m i) m (ThunkId (FreshIdT i m)) -> FreshIdT i m (ThunkId (FreshIdT i m)) forall i (m :: * -> *) a. ReaderT (Ref m i) m a -> FreshIdT i m a FreshIdT (ReaderT (Ref m i) m (ThunkId (FreshIdT i m)) -> FreshIdT i m (ThunkId (FreshIdT i m))) -> ReaderT (Ref m i) m (ThunkId (FreshIdT i m)) -> FreshIdT i m (ThunkId (FreshIdT i m)) forall a b. (a -> b) -> a -> b $ do Ref m i v <- ReaderT (Ref m i) m (Ref m i) forall r (m :: * -> *). MonadReader r m => m r ask Ref (ReaderT (Ref m i) m) i -> (i -> (i, i)) -> ReaderT (Ref m i) m i forall a b. Ref (ReaderT (Ref m i) m) a -> (a -> (a, b)) -> ReaderT (Ref m i) m b forall (m :: * -> *) a b. MonadAtomicRef m => Ref m a -> (a -> (a, b)) -> m b atomicModifyRef Ref m i Ref (ReaderT (Ref m i) m) i v (\i i -> (i -> i forall a. Enum a => a -> a succ i i, i i)) runFreshIdT :: Functor m => FreshIdT i m a -> Ref m i -> m a runFreshIdT :: forall (m :: * -> *) i a. Functor m => FreshIdT i m a -> Ref m i -> m a runFreshIdT = ReaderT (Ref m i) m a -> Ref m i -> m a forall r (m :: * -> *) a. ReaderT r m a -> r -> m a runReaderT (ReaderT (Ref m i) m a -> Ref m i -> m a) -> (FreshIdT i m a -> ReaderT (Ref m i) m a) -> FreshIdT i m a -> Ref m i -> m a forall b c a. (b -> c) -> (a -> b) -> a -> c . FreshIdT i m a -> ReaderT (Ref m i) m a forall a b. Coercible a b => a -> b coerce