content: {-# LANGUAGE AllowAmbiguousTypes #-}
  {-# LANGUAGE FlexibleContexts #-}
  {-# LANGUAGE PolyKinds #-}
  {-# LANGUAGE ScopedTypeVariables #-}
  {-# LANGUAGE TypeApplications #-}
  -- | Labelled 'Reader' operations.
  --
  -- @since 1.0.2.0
  module Control.Effect.Reader.Labelled
  ( -- * Reader effect
    Reader
  , ask
  , asks
  , local
    -- * Re-exports
  , Algebra
  , Has
  , HasLabelled
  , run
  ) where
  
  import           Control.Effect.Labelled
  import qualified Control.Effect.Reader as R
  import           Control.Effect.Reader.Internal
  
  -- | Retrieve the environment value.
  --
  -- @
  -- runReader a ('runLabelled' @label ('ask' @label) '>>=' k) = runReader a (k a)
  -- @
  --
  -- @since 1.0.2.0
  ask :: forall label r m sig . HasLabelled label (Reader r) sig m => m r
  ask = runUnderLabel @label R.ask
  {-# INLINE ask #-}
  
  -- | Project a function out of the current environment value.
  --
  -- @
  -- 'asks' @label f = 'fmap' f ('ask' @label)
  -- @
  --
  -- @since 1.0.2.0
  asks :: forall label r m a sig . HasLabelled label (Reader r) sig m => (r -> a) -> m a
  asks f = runUnderLabel @label (R.asks f)
  {-# INLINE asks #-}
  
  -- | Run a computation with an environment value locally modified by the passed function.
  --
  -- @
  -- runReader a ('runLabelled' @label ('local' @label f m)) = runReader (f a) m
  -- @
  --
  -- @since 1.0.2.0
  local :: forall label r m a sig . HasLabelled label (Reader r) sig m => (r -> r) -> m a -> m a
  local f m = runUnderLabel @label (R.local f (UnderLabel m))
  {-# INLINE local #-}
  