module Control.Monad.Reader.Lens where import Control.Applicative import Control.Category.Unicode import Control.Lens as L import Control.Monad.Reader hiding (asks, local) import qualified Control.Monad.Reader as M asks :: (MonadReader α m) => ((a -> Const a b) -> α -> Const a β) -> m a asks = M.asks ∘ L.get local :: (MonadReader α m) => Lens α α a b -> (a -> b) -> m c -> m c local = M.local ∘∘ L.modify where f ∘∘ g = (f ∘) ∘ g localM :: (MonadReader α m) => Lens α α a b -> (a -> m b) -> m c -> m c localM l f x = M.ask >>= l f >>= flip M.local x ∘ pure