package scalaz

trait MonadReader[F[_,_],S] extends Monad[({type f[x]=F[S,x]})#f] {
  def ask: F[S,S]
  def local[A](f: S => S)(fa: F[S,A]): F[S,A]
  def scope[A](k: S)(fa: F[S,A]): F[S,A] = local(_ => k)(fa)
  def asks[A](f: S => A): F[S,A] = map(ask)(f)
}

object MonadReader {
  def apply[F[_, _], S](implicit F: MonadReader[F, S]) = F
}