effectful-core-2.4.0.0: src/Effectful/Labeled/Reader.hs
{-# LANGUAGE AllowAmbiguousTypes #-}
-- | Convenience functions for the 'Labeled' 'Reader' effect.
--
-- @since 2.4.0.0
module Effectful.Labeled.Reader
( -- * Effect
Reader(..)
-- ** Handlers
, runReader
-- ** Operations
, ask
, asks
, local
) where
import Effectful
import Effectful.Dispatch.Dynamic
import Effectful.Labeled
import Effectful.Reader.Dynamic (Reader(..))
import Effectful.Reader.Dynamic qualified as R
-- | Run the 'Reader' effect with the given initial environment (via
-- "Effectful.Reader.Static").
runReader
:: forall label r es a
. HasCallStack
=> r
-- ^ The initial environment.
-> Eff (Labeled label (Reader r) : es) a
-> Eff es a
runReader = runLabeled @label . R.runReader
----------------------------------------
-- Operations
-- | Fetch the value of the environment.
ask
:: forall label r es
. (HasCallStack, Labeled label (Reader r) :> es)
=> Eff es r
ask = send $ Labeled @label Ask
-- | Retrieve a function of the current environment.
--
-- @'asks' f ≡ f '<$>' 'ask'@
asks
:: forall label r es a
. (HasCallStack, Labeled label (Reader r) :> es)
=> (r -> a)
-- ^ The function to apply to the environment.
-> Eff es a
asks f = f <$> ask @label
-- | Execute a computation in a modified environment.
--
-- @'runReader' r ('local' f m) ≡ 'runReader' (f r) m@
--
local
:: forall label r es a
. (HasCallStack, Labeled label (Reader r) :> es)
=> (r -> r)
-- ^ The function to modify the environment.
-> Eff es a
-> Eff es a
local f = send . Labeled @label . Local f