module Data.Trifunctor.Monoidal where import Control.Category.Tensor class ( Associative t1 cat , Associative t2 cat , Associative t3 cat , Associative to cat ) => Semigroupal cat t1 t2 t3 to f where combine :: to (f x y z) (f x' y' z') `cat` f (t1 x x') (t2 y y') (t3 z z') class Unital cat i1 i2 i3 o f where introduce :: o `cat` f i1 i2 i3 class ( Tensor t1 i1 cat , Tensor t2 i2 cat , Tensor t3 i3 cat , Tensor to io cat , Semigroupal cat t1 t2 t3 to f , Unital cat i1 i2 i3 io f ) => Monoidal cat t1 i1 t2 i2 t3 i3 to io f