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