module Yael.Eff.Reader where

import Yael.Eff
import qualified Control.Monad.Reader as R

data Reader r m = Reader
  { _ask :: m r
  , _local :: forall a . (r -> r) -> m a -> m a
  }

ask :: r :+ '[Reader r]
ask = withEffT _ask

local :: (HasEff (Reader r) f m) => (r -> r) -> EffT f m a -> EffT f m a
local f m = withEffT' $ \lower Reader{_local} -> _local f (lower m)

mtlReader :: R.MonadReader r m => Reader r m
mtlReader = Reader
  { _ask = R.ask
  , _local = R.local
  }