module Pandora.Paradigm.Primary.Functor.Proxy where

import Pandora.Pattern.Functor.Covariant (Covariant ((<-|-)))
import Pandora.Pattern.Functor.Contravariant (Contravariant ((>-|-)))
import Pandora.Pattern.Functor.Distributive (Distributive ((-<<)))
import Pandora.Pattern.Functor.Bindable (Bindable ((=<<)))
import Pandora.Pattern.Functor.Extendable (Extendable ((<<=)))
--import Pandora.Pattern.Functor.Monad (Monad)
import Pandora.Paradigm.Algebraic.Exponential ()

data Proxy a = Proxy

instance Covariant (->) (->) Proxy where
	a -> b
_ <-|- :: (a -> b) -> Proxy a -> Proxy b
<-|- Proxy a
Proxy = Proxy b
forall k (a :: k). Proxy a
Proxy

instance Contravariant (->) (->) Proxy where
	a -> b
_ >-|- :: (a -> b) -> Proxy b -> Proxy a
>-|- Proxy b
_ = Proxy a
forall k (a :: k). Proxy a
Proxy

instance Distributive (->) (->) Proxy where
	a -> Proxy b
_ -<< :: (a -> Proxy b) -> u a -> Proxy (u b)
-<< u a
_ = Proxy (u b)
forall k (a :: k). Proxy a
Proxy

instance Bindable (->) Proxy where
	a -> Proxy b
_ =<< :: (a -> Proxy b) -> Proxy a -> Proxy b
=<< Proxy a
_ = Proxy b
forall k (a :: k). Proxy a
Proxy

--instance Monad Proxy

instance Extendable (->) Proxy where
	Proxy a -> b
_ <<= :: (Proxy a -> b) -> Proxy a -> Proxy b
<<= Proxy a
_ = Proxy b
forall k (a :: k). Proxy a
Proxy