packages feed

effectful-0.0.0.0: src/Effectful/Reader.hs

-- | The 'Reader' as an effect.
module Effectful.Reader
  ( Reader
  , runReader
  , ask
  , local
  , reader
  , asks
  ) where

import Effectful.Internal.Has
import Effectful.Internal.Monad

-- | Provide access to a read only value of type @r@.
newtype Reader r = Reader { unReader :: r }

runReader :: r -> Eff (Reader r : es) a -> Eff es a
runReader r = evalEffect (Reader r)

ask :: Reader r :> es => Eff es r
ask = unReader <$> getEffect

local :: Reader r :> es => (r -> r) -> Eff es a -> Eff es a
local f = localEffect (Reader . f . unReader)

reader :: Reader r :> es => (r -> a) -> Eff es a
reader f = f . unReader <$> getEffect

asks :: Reader r :> es => (r -> a) -> Eff es a
asks = reader