{-# 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)