{-# OPTIONS_GHC -fno-warn-orphans #-} module Pandora.Paradigm.Primary (module Exports) where import Pandora.Paradigm.Primary.Linear as Exports import Pandora.Paradigm.Primary.Transformer as Exports import Pandora.Paradigm.Primary.Functor as Exports import Pandora.Paradigm.Primary.Object as Exports import Pandora.Paradigm.Primary.Algebraic as Exports import Pandora.Core.Functor (type (:=)) import Pandora.Pattern.Semigroupoid (Semigroupoid ((.))) import Pandora.Pattern.Category (Category (($), (#))) import Pandora.Pattern.Functor.Covariant (Covariant ((-<$>-))) import Pandora.Pattern.Functor.Adjoint (Adjoint ((|-), (-|))) import Pandora.Pattern.Transformer.Liftable (lift) import Pandora.Pattern.Transformer.Lowerable (lower) import Pandora.Paradigm.Controlflow.Effect.Interpreted (run) import Pandora.Paradigm.Inventory.Store (Store (Store)) import Pandora.Paradigm.Schemes (TU (TU), P_Q_T (P_Q_T), type (<:.>), type (<:.:>)) import Pandora.Paradigm.Structure.Ability.Monotonic (Monotonic (resolve)) import Pandora.Paradigm.Structure.Ability.Morphable (Morphable (Morphing, morphing), Morph (Into), premorph) import Pandora.Paradigm.Structure.Ability.Substructure (Substructure (Available, Substance, substructure)) instance Adjoint (->) (->) (Flip (:*:) s) ((->) s) where f -| x = \s -> f $ Flip $ x :*: s f |- Flip (x :*: s) = f x s instance Morphable (Into Maybe) (Conclusion e) where type Morphing (Into Maybe) (Conclusion e) = Maybe morphing = conclusion (Nothing !.) Just . premorph instance Morphable (Into (Conclusion e)) Maybe where type Morphing (Into (Conclusion e)) Maybe = (->) e <:.> Conclusion e morphing (premorph -> Just x) = TU $ \_ -> Success x morphing (premorph -> Nothing) = TU $ \e -> Failure e instance Morphable (Into (Flip Conclusion e)) Maybe where type Morphing (Into (Flip Conclusion e)) Maybe = (->) e <:.> Flip Conclusion e morphing (run . premorph -> Just x) = TU $ \_ -> Flip $ Failure x morphing (run . premorph -> Nothing) = TU $ Flip . Success instance Morphable (Into (Left Maybe)) Wye where type Morphing (Into (Left Maybe)) Wye = Maybe morphing (premorph -> Both ls _) = Just ls morphing (premorph -> Left ls) = Just ls morphing (premorph -> Right _) = Nothing morphing (premorph -> End) = Nothing instance Morphable (Into (Right Maybe)) Wye where type Morphing (Into (Right Maybe)) Wye = Maybe morphing (premorph -> Both _ rs) = Just rs morphing (premorph -> Left _) = Nothing morphing (premorph -> Right rs) = Just rs morphing (premorph -> End) = Nothing instance Morphable (Into (This Maybe)) (These e) where type Morphing (Into (This Maybe)) (These e) = Maybe morphing (premorph -> This x) = Just x morphing (premorph -> That _) = Nothing morphing (premorph -> These _ x) = Just x instance Morphable (Into (That Maybe)) (Flip These a) where type Morphing (Into (That Maybe)) (Flip These a) = Maybe morphing (run . premorph -> This _) = Nothing morphing (run . premorph -> That x) = Just x morphing (run . premorph -> These y _) = Just y instance Morphable (Into (Here Maybe)) (Flip Wedge a) where type Morphing (Into (Here Maybe)) (Flip Wedge a) = Maybe morphing (run . premorph -> Nowhere) = Nothing morphing (run . premorph -> Here x) = Just x morphing (run . premorph -> There _) = Nothing instance Morphable (Into (There Maybe)) (Wedge e) where type Morphing (Into (There Maybe)) (Wedge e) = Maybe morphing (premorph -> Nowhere) = Nothing morphing (premorph -> Here _) = Nothing morphing (premorph -> There x) = Just x instance Morphable (Into Wye) (Maybe <:.:> Maybe := (:*:)) where type Morphing (Into Wye) (Maybe <:.:> Maybe := (:*:)) = Wye morphing (run . premorph -> Just x :*: Just y) = Both x y morphing (run . premorph -> Nothing :*: Just y) = Right y morphing (run . premorph -> Just x :*: Nothing) = Left x morphing (run . premorph -> Nothing :*: Nothing) = End instance Substructure Left Wye where type Available Left Wye = Maybe type Substance Left Wye = Identity substructure = P_Q_T $ \new -> case lower new of End -> Store $ Nothing :*: lift . resolve Left End . (extract -<$>-) Left x -> Store $ Just (Identity x) :*: lift . resolve Left End . (extract -<$>-) Right y -> Store $ Nothing :*: (lift # Right y !.) . (extract -<$>-) Both x y -> Store $ Just (Identity x) :*: lift . resolve (Both % y) (Right y) . (extract -<$>-) instance Substructure Right Wye where type Available Right Wye = Maybe type Substance Right Wye = Identity substructure = P_Q_T $ \new -> case lower new of End -> Store $ Nothing :*: lift . resolve Right End . (extract -<$>-) Left x -> Store $ Nothing :*: (lift # Left x !.) . (extract -<$>-) Right y -> Store $ Just (Identity y) :*: lift . resolve Right End . (extract -<$>-) Both x y -> Store $ Just (Identity y) :*: lift . resolve (Both x) (Left x) . (extract -<$>-)