{-# 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