-- | Provides the 'MonadEvaluate' class.
--
-- @since 0.1
module Effects.Evaluate
  ( -- * Effect
    MonadEvaluate (..),
  )
where

import Control.Exception qualified as Ex
import Control.Monad.Trans.Class (MonadTrans (lift))
import Control.Monad.Trans.Reader (ReaderT)
import GHC.Stack (HasCallStack)

-- | 'Evaluate' effect.
--
-- @since 0.1
class (Monad m) => MonadEvaluate m where
  -- | Lifted 'Ex.evaluate'.
  --
  -- @since 0.1
  evaluate :: (HasCallStack) => a -> m a

-- | @since 0.1
instance MonadEvaluate IO where
  evaluate :: forall a. HasCallStack => a -> IO a
evaluate = a -> IO a
forall a. a -> IO a
Ex.evaluate
  {-# INLINEABLE evaluate #-}

-- | @since 0.1
instance (MonadEvaluate m) => MonadEvaluate (ReaderT e m) where
  evaluate :: forall a. HasCallStack => a -> ReaderT e m a
evaluate = m a -> ReaderT e m a
forall (m :: * -> *) a. Monad m => m a -> ReaderT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ReaderT e m a) -> (a -> m a) -> a -> ReaderT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> m a
forall a. HasCallStack => a -> m a
forall (m :: * -> *) a. (MonadEvaluate m, HasCallStack) => a -> m a
evaluate
  {-# INLINEABLE evaluate #-}