{-# LANGUAGE GeneralizedNewtypeDeriving #-} module Initialiser.Types ( Initialiser, runInitialiser, ) where import Control.Monad.Catch (MonadThrow) import Control.Monad.IO.Class (MonadIO) import Control.Monad.Logger (LoggingT, MonadLogger, runStderrLoggingT) import Control.Monad.Reader (MonadReader, ReaderT, runReaderT) import qualified Environment (T) newtype Initialiser a = Initialiser { forall a. Initialiser a -> LoggingT (ReaderT T IO) a run :: LoggingT (ReaderT Environment.T IO) a } deriving (Functor Initialiser Functor Initialiser => (forall a. a -> Initialiser a) -> (forall a b. Initialiser (a -> b) -> Initialiser a -> Initialiser b) -> (forall a b c. (a -> b -> c) -> Initialiser a -> Initialiser b -> Initialiser c) -> (forall a b. Initialiser a -> Initialiser b -> Initialiser b) -> (forall a b. Initialiser a -> Initialiser b -> Initialiser a) -> Applicative Initialiser forall a. a -> Initialiser a forall a b. Initialiser a -> Initialiser b -> Initialiser a forall a b. Initialiser a -> Initialiser b -> Initialiser b forall a b. Initialiser (a -> b) -> Initialiser a -> Initialiser b forall a b c. (a -> b -> c) -> Initialiser a -> Initialiser b -> Initialiser 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 -> Initialiser a pure :: forall a. a -> Initialiser a $c<*> :: forall a b. Initialiser (a -> b) -> Initialiser a -> Initialiser b <*> :: forall a b. Initialiser (a -> b) -> Initialiser a -> Initialiser b $cliftA2 :: forall a b c. (a -> b -> c) -> Initialiser a -> Initialiser b -> Initialiser c liftA2 :: forall a b c. (a -> b -> c) -> Initialiser a -> Initialiser b -> Initialiser c $c*> :: forall a b. Initialiser a -> Initialiser b -> Initialiser b *> :: forall a b. Initialiser a -> Initialiser b -> Initialiser b $c<* :: forall a b. Initialiser a -> Initialiser b -> Initialiser a <* :: forall a b. Initialiser a -> Initialiser b -> Initialiser a Applicative, (forall a b. (a -> b) -> Initialiser a -> Initialiser b) -> (forall a b. a -> Initialiser b -> Initialiser a) -> Functor Initialiser forall a b. a -> Initialiser b -> Initialiser a forall a b. (a -> b) -> Initialiser a -> Initialiser 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) -> Initialiser a -> Initialiser b fmap :: forall a b. (a -> b) -> Initialiser a -> Initialiser b $c<$ :: forall a b. a -> Initialiser b -> Initialiser a <$ :: forall a b. a -> Initialiser b -> Initialiser a Functor, Applicative Initialiser Applicative Initialiser => (forall a b. Initialiser a -> (a -> Initialiser b) -> Initialiser b) -> (forall a b. Initialiser a -> Initialiser b -> Initialiser b) -> (forall a. a -> Initialiser a) -> Monad Initialiser forall a. a -> Initialiser a forall a b. Initialiser a -> Initialiser b -> Initialiser b forall a b. Initialiser a -> (a -> Initialiser b) -> Initialiser 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. Initialiser a -> (a -> Initialiser b) -> Initialiser b >>= :: forall a b. Initialiser a -> (a -> Initialiser b) -> Initialiser b $c>> :: forall a b. Initialiser a -> Initialiser b -> Initialiser b >> :: forall a b. Initialiser a -> Initialiser b -> Initialiser b $creturn :: forall a. a -> Initialiser a return :: forall a. a -> Initialiser a Monad, Monad Initialiser Monad Initialiser => (forall a. IO a -> Initialiser a) -> MonadIO Initialiser forall a. IO a -> Initialiser a forall (m :: * -> *). Monad m => (forall a. IO a -> m a) -> MonadIO m $cliftIO :: forall a. IO a -> Initialiser a liftIO :: forall a. IO a -> Initialiser a MonadIO, Monad Initialiser Monad Initialiser => (forall msg. ToLogStr msg => Loc -> LogSource -> LogLevel -> msg -> Initialiser ()) -> MonadLogger Initialiser forall msg. ToLogStr msg => Loc -> LogSource -> LogLevel -> msg -> Initialiser () forall (m :: * -> *). Monad m => (forall msg. ToLogStr msg => Loc -> LogSource -> LogLevel -> msg -> m ()) -> MonadLogger m $cmonadLoggerLog :: forall msg. ToLogStr msg => Loc -> LogSource -> LogLevel -> msg -> Initialiser () monadLoggerLog :: forall msg. ToLogStr msg => Loc -> LogSource -> LogLevel -> msg -> Initialiser () MonadLogger, MonadReader Environment.T, Monad Initialiser Monad Initialiser => (forall e a. (HasCallStack, Exception e) => e -> Initialiser a) -> MonadThrow Initialiser forall e a. (HasCallStack, Exception e) => e -> Initialiser a forall (m :: * -> *). Monad m => (forall e a. (HasCallStack, Exception e) => e -> m a) -> MonadThrow m $cthrowM :: forall e a. (HasCallStack, Exception e) => e -> Initialiser a throwM :: forall e a. (HasCallStack, Exception e) => e -> Initialiser a MonadThrow) runInitialiser :: Initialiser a -> Environment.T -> IO a runInitialiser :: forall a. Initialiser a -> T -> IO a runInitialiser Initialiser a initialiser = ReaderT T IO a -> T -> IO a forall r (m :: * -> *) a. ReaderT r m a -> r -> m a runReaderT (LoggingT (ReaderT T IO) a -> ReaderT T IO a forall (m :: * -> *) a. MonadIO m => LoggingT m a -> m a runStderrLoggingT (LoggingT (ReaderT T IO) a -> ReaderT T IO a) -> LoggingT (ReaderT T IO) a -> ReaderT T IO a forall a b. (a -> b) -> a -> b $ Initialiser a -> LoggingT (ReaderT T IO) a forall a. Initialiser a -> LoggingT (ReaderT T IO) a run Initialiser a initialiser)