module SubHask.Category.Slice
    where

import GHC.Prim
import qualified Prelude as P

import SubHask.Category
import SubHask.Algebra
import SubHask.Internal.Prelude

-------------------------------------------------------------------------------

data Comma cat1 cat2 cat3 a b = Comma (cat1 a b) (cat2 a b)

instance
    ( Category cat1
    , Category cat2
    , Category cat3
    ) => Category (Comma cat1 cat2 cat3)
        where

    type ValidCategory (Comma cat1 cat2 cat3) a =
        ( ValidCategory cat1 a
        , ValidCategory cat2 a
        )

    id = Comma id id
    (Comma f1 g1).(Comma f2 g2) = Comma (f1.f2) (g1.g2)

-- runComma :: ValidCategory (Comma cat1 cat2 cat3) a b =>
--     (Comma cat1 cat2 cat3) a b -> cat3 a b -> cat3 a b

-------------------------------------------------------------------------------

data (cat / (obj :: *)) (a :: *) (b :: *) = Slice (cat a b)

instance Category cat => Category (cat/obj) where
    type ValidCategory (cat/obj) (a :: *) =
        ( ValidCategory cat a
        , Category cat
        )

    id = Slice id
    (Slice f).(Slice g) = Slice $ f.g

runSlice ::
    ( ValidCategory (cat/obj) a
    , ValidCategory (cat/obj) b
    ) => (cat/obj) a b -> (cat b obj) -> (cat a obj)
runSlice (Slice cat1) cat2 = cat2.cat1