{-# 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.Pattern (($), (.), extract)
import Pandora.Paradigm.Primary (Product ((:*:)), Tagged (Tag), Wye (Left, Right))
import Pandora.Paradigm.Inventory (Store (Store))

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 :*:)