module Pandora.Paradigm.Primary.Transformer.Flip where

import Pandora.Pattern.Functor.Bivariant (Bivariant ((<->)))
import Pandora.Paradigm.Controlflow.Effect.Interpreted (Interpreted (Primary, run, unite, (||=)))

newtype Flip (v :: * -> * -> *) a e = Flip (v e a)

instance Interpreted (Flip v a) where
	type Primary (Flip v a) e = v e a
	run :: Flip v a a -> Primary (Flip v a) a
run ~(Flip v a a
x) = v a a
Primary (Flip v a) a
x
	unite :: Primary (Flip v a) a -> Flip v a a
unite = Primary (Flip v a) a -> Flip v a a
forall (v :: * -> * -> *) a e. v e a -> Flip v a e
Flip

instance Bivariant v => Bivariant (Flip v) where
	a -> b
f <-> :: (a -> b) -> (c -> d) -> Flip v a c -> Flip v b d
<-> c -> d
g = \Flip v a c
x -> (c -> d
g (c -> d) -> (a -> b) -> v c a -> v d b
forall (v :: * -> * -> *) a b c d.
Bivariant v =>
(a -> b) -> (c -> d) -> v a c -> v b d
<-> a -> b
f) (Primary (Flip v a) c -> Primary (Flip v b) d)
-> Flip v a c -> Flip v b d
forall (t :: * -> *) (u :: * -> *) a b.
(Interpreted t, Interpreted u) =>
(Primary t a -> Primary u b) -> t a -> u b
||= Flip v a c
x