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