{-# 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 = asksA . arr; asksA :: (ArrowReader r s) => s r a -> s () a; asksA x = ask >>> x;