pandora-0.3.2: Pandora/Paradigm/Structure.hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Pandora.Paradigm.Structure (module Exports) where
import Pandora.Paradigm.Structure.Ability as Exports
import Pandora.Paradigm.Structure.Interface as Exports
import Pandora.Paradigm.Structure.Rose as Exports
import Pandora.Paradigm.Structure.Splay as Exports
import Pandora.Paradigm.Structure.Binary as Exports
import Pandora.Paradigm.Structure.Stack as Exports
import Pandora.Paradigm.Structure.Stream as Exports
import Pandora.Pattern (($), (.), extract)
import Pandora.Paradigm.Controlflow.Effect.Interpreted (run)
import Pandora.Paradigm.Inventory (Store (Store), (^.), (.~))
import Pandora.Paradigm.Primary.Functor.Delta (Delta ((:^:)))
import Pandora.Paradigm.Primary.Functor.Product (Product ((:*:)), type (:*:), attached)
import Pandora.Paradigm.Primary.Functor.Tagged (Tagged (Tag))
import Pandora.Paradigm.Primary.Functor.Wye (Wye (Left, Right))
import Pandora.Paradigm.Primary.Transformer.Tap (Tap (Tap))
import Pandora.Paradigm.Schemes.TU (type (<:.>))
instance Monotonic a s => Monotonic (s :*: a) s where
bypass f r x = bypass f (f (attached x) r) $ extract x
instance Substructure Left (Product s) where
type Substructural Left (Product s) a = s
substructure (extract -> s :*: x) = Store $ s :*: Tag . (:*: x)
instance Substructure Right (Product s) where
type Substructural Right (Product s) a = a
substructure (extract -> s :*: x) = Store $ x :*: Tag . (s :*:)
instance Substructure Left Delta where
type Substructural Left Delta a = a
substructure (extract -> l :^: r) = Store $ l :*: Tag . (:^: r)
instance Substructure Right Delta where
type Substructural Right Delta a = a
substructure (extract -> l :^: r) = Store $ r :*: Tag . (l :^:)
instance Substructure Left t => Substructure Left (Tap (t <:.> u)) where
type Substructural Left (Tap (t <:.> u)) a = Substructural Left t (u a)
substructure (extract -> Tap x xs) = Store $
sub @Left ^. run xs :*: Tag . (\new -> sub @Left .~ new $ Tap x xs)
instance Substructure Right t => Substructure Right (Tap (t <:.> u)) where
type Substructural Right (Tap (t <:.> u)) a = Substructural Right t (u a)
substructure (extract -> Tap x xs) = Store $
sub @Right ^. run xs :*: Tag . (\new -> sub @Right .~ new $ Tap x xs)