module Pandora.Paradigm.Primary.Functor.Convergence where

import Pandora.Pattern.Category (($), (#))
import Pandora.Pattern.Functor.Contravariant (Contravariant ((>$<)))
import Pandora.Paradigm.Primary.Algebraic ()

data Convergence r a = Convergence (a -> a -> r)

instance Contravariant (->) (->) (Convergence r) where
	a -> b
f >$< :: (a -> b) -> Convergence r b -> Convergence r a
>$< Convergence b -> b -> r
g = (a -> a -> r) -> Convergence r a
forall r a. (a -> a -> r) -> Convergence r a
Convergence ((a -> a -> r) -> Convergence r a)
-> (a -> a -> r) -> Convergence r a
forall (m :: * -> * -> *) a b. Category m => m (m a b) (m a b)
$ \a
x a
y -> b -> b -> r
g (b -> b -> r) -> b -> b -> r
forall (m :: * -> * -> *) a b. Category m => m (m a b) (m a b)
# a -> b
f a
x (b -> r) -> b -> r
forall (m :: * -> * -> *) a b. Category m => m (m a b) (m a b)
# a -> b
f a
y