{-# LANGUAGE FunctionalDependencies #-}

module Control.Arrow.Reader.Class where

import Control.Arrow;
import Control.Arrow.Transformer;

class Arrow s => ArrowReader r s | s -> r where {
  ask :: s () r;
  local :: (r -> r) -> s a b -> s a b;
};

asks :: (ArrowReader r s) => (r -> a) -> s () a;
asks x = ask >>> arr x;