iris-0.0.0.0: src/Iris/App.hs
{-# LANGUAGE DerivingVia #-}
{- |
Module : Iris.Env
Copyright : (c) 2022 Dmitrii Kovanikov
SPDX-License-Identifier : MPL-2.0
Maintainer : Dmitrii Kovanikov <kovanikov@gmail.com>
Stability : Experimental
Portability : Portable
Haskell CLI framework
@since 0.0.0.0
-}
module Iris.App
( CliApp (..)
, runCliApp
, runCliAppManually
) where
import Control.Monad.IO.Class (MonadIO)
import Control.Monad.Reader (MonadReader, ReaderT (..))
import Control.Monad.IO.Unlift (MonadUnliftIO)
import Iris.Env (CliEnv, CliEnvSettings, mkCliEnv)
{- | Main monad for your CLI application.
@since 0.0.0.0
-}
newtype CliApp cmd appEnv a = CliApp
{ unCliApp :: CliEnv cmd appEnv -> IO a
} deriving
( Functor
-- ^ @since 0.0.0.0
, Applicative
-- ^ @since 0.0.0.0
, Monad
-- ^ @since 0.0.0.0
, MonadIO
-- ^ @since 0.0.0.0
, MonadReader (CliEnv cmd appEnv)
-- ^ @since 0.0.0.0
, MonadUnliftIO
-- ^ @since 0.0.0.0
) via ReaderT (CliEnv cmd appEnv) IO
{- | Run application with settings.
@since 0.0.0.0
-}
runCliApp :: CliEnvSettings cmd appEnv -> CliApp cmd appEnv a -> IO a
runCliApp settings cliApp = do
cliEnv <- mkCliEnv settings
runCliAppManually cliEnv cliApp
{- | Run application by constructing 'CliEnv' settings manually.
@since 0.0.0.0
-}
runCliAppManually :: CliEnv cmd appEnv -> CliApp cmd appEnv a -> IO a
runCliAppManually cliEnv (CliApp run) = run cliEnv