-- |  Basic definitions.
module LiBro.Base where

import LiBro.Config
import Control.Monad.Reader

-- |  Internal monad for 'Config'ured libro effects.
newtype LiBro a = LiBro
  { forall a. LiBro a -> ReaderT Config IO a
unLiBro :: ReaderT Config IO a
  } deriving  ( (forall a b. (a -> b) -> LiBro a -> LiBro b)
-> (forall a b. a -> LiBro b -> LiBro a) -> Functor LiBro
forall a b. a -> LiBro b -> LiBro a
forall a b. (a -> b) -> LiBro a -> LiBro 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) -> LiBro a -> LiBro b
fmap :: forall a b. (a -> b) -> LiBro a -> LiBro b
$c<$ :: forall a b. a -> LiBro b -> LiBro a
<$ :: forall a b. a -> LiBro b -> LiBro a
Functor
              , Functor LiBro
Functor LiBro =>
(forall a. a -> LiBro a)
-> (forall a b. LiBro (a -> b) -> LiBro a -> LiBro b)
-> (forall a b c. (a -> b -> c) -> LiBro a -> LiBro b -> LiBro c)
-> (forall a b. LiBro a -> LiBro b -> LiBro b)
-> (forall a b. LiBro a -> LiBro b -> LiBro a)
-> Applicative LiBro
forall a. a -> LiBro a
forall a b. LiBro a -> LiBro b -> LiBro a
forall a b. LiBro a -> LiBro b -> LiBro b
forall a b. LiBro (a -> b) -> LiBro a -> LiBro b
forall a b c. (a -> b -> c) -> LiBro a -> LiBro b -> LiBro 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 -> LiBro a
pure :: forall a. a -> LiBro a
$c<*> :: forall a b. LiBro (a -> b) -> LiBro a -> LiBro b
<*> :: forall a b. LiBro (a -> b) -> LiBro a -> LiBro b
$cliftA2 :: forall a b c. (a -> b -> c) -> LiBro a -> LiBro b -> LiBro c
liftA2 :: forall a b c. (a -> b -> c) -> LiBro a -> LiBro b -> LiBro c
$c*> :: forall a b. LiBro a -> LiBro b -> LiBro b
*> :: forall a b. LiBro a -> LiBro b -> LiBro b
$c<* :: forall a b. LiBro a -> LiBro b -> LiBro a
<* :: forall a b. LiBro a -> LiBro b -> LiBro a
Applicative
              , Applicative LiBro
Applicative LiBro =>
(forall a b. LiBro a -> (a -> LiBro b) -> LiBro b)
-> (forall a b. LiBro a -> LiBro b -> LiBro b)
-> (forall a. a -> LiBro a)
-> Monad LiBro
forall a. a -> LiBro a
forall a b. LiBro a -> LiBro b -> LiBro b
forall a b. LiBro a -> (a -> LiBro b) -> LiBro 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. LiBro a -> (a -> LiBro b) -> LiBro b
>>= :: forall a b. LiBro a -> (a -> LiBro b) -> LiBro b
$c>> :: forall a b. LiBro a -> LiBro b -> LiBro b
>> :: forall a b. LiBro a -> LiBro b -> LiBro b
$creturn :: forall a. a -> LiBro a
return :: forall a. a -> LiBro a
Monad
              , MonadReader Config
              , Monad LiBro
Monad LiBro => (forall a. String -> LiBro a) -> MonadFail LiBro
forall a. String -> LiBro a
forall (m :: * -> *).
Monad m =>
(forall a. String -> m a) -> MonadFail m
$cfail :: forall a. String -> LiBro a
fail :: forall a. String -> LiBro a
MonadFail
              , Monad LiBro
Monad LiBro => (forall a. IO a -> LiBro a) -> MonadIO LiBro
forall a. IO a -> LiBro a
forall (m :: * -> *).
Monad m =>
(forall a. IO a -> m a) -> MonadIO m
$cliftIO :: forall a. IO a -> LiBro a
liftIO :: forall a. IO a -> LiBro a
MonadIO
              )

-- |  Run a 'Config'ured libro effect in 'IO'.
runLiBro :: Config -> LiBro a -> IO a
runLiBro :: forall a. Config -> LiBro a -> IO a
runLiBro Config
config = (ReaderT Config IO a -> Config -> IO a)
-> Config -> ReaderT Config IO a -> IO a
forall a b c. (a -> b -> c) -> b -> a -> c
flip ReaderT Config IO a -> Config -> IO a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT Config
config (ReaderT Config IO a -> IO a)
-> (LiBro a -> ReaderT Config IO a) -> LiBro a -> IO a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LiBro a -> ReaderT Config IO a
forall a. LiBro a -> ReaderT Config IO a
unLiBro