{-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE TypeFamilies #-} module Data.Profunctor.Reader.Class where import Data.Profunctor class (Profunctor p) => ProfunctorReader r p | p -> r where {-# MINIMAL (ask | reader), local #-} ask :: p a (a, r) ask = (r -> a -> (a, r)) -> p a (a, r) forall r (p :: * -> * -> *) a b. ProfunctorReader r p => (r -> a -> b) -> p a b reader ((a -> r -> (a, r)) -> r -> a -> (a, r) forall a b c. (a -> b -> c) -> b -> a -> c flip (,)) reader :: (r -> a -> b) -> p a b reader f :: r -> a -> b f = ((a, r) -> b) -> p a (a, r) -> p a b forall (p :: * -> * -> *) b c a. Profunctor p => (b -> c) -> p a b -> p a c rmap ((a -> r -> b) -> (a, r) -> b forall a b c. (a -> b -> c) -> (a, b) -> c uncurry ((r -> a -> b) -> a -> r -> b forall a b c. (a -> b -> c) -> b -> a -> c flip r -> a -> b f)) p a (a, r) forall r (p :: * -> * -> *) a. ProfunctorReader r p => p a (a, r) ask local :: (r -> r) -> p a b -> p a b class (Profunctor p) => ProfunctorReader' r p | p -> r where {-# MINIMAL ask', local' #-} ask' :: p (a, r) b -> p a b local' :: (r -> r) -> p a b -> p a b