module Freelude.Impl.MonoidAsCategory (
MonoidAsCategory(MonoidAsCategory, getMonoidAsCategory)
) where
import Freelude.Impl.Classes
import Data.Void (Void)
import Data.Semigroup (Semigroup((<>)))
import Data.Monoid (Monoid(mempty))
import Data.Type.Equality (type (~~))
newtype MonoidAsCategory a = MonoidAsCategory { getMonoidAsCategory :: a }
class (a ~~ Void) => VoidC a
instance (a ~~ Void) => VoidC a
type instance CategoryT (MonoidAsCategory a) Void Void = MonoidAsCategory a
type instance CategorySrcC' (MonoidAsCategory _) = 'Just VoidC
type instance CategoryDstC' (MonoidAsCategory _) = 'Just VoidC
instance Semigroup m => Semigroupoid (MonoidAsCategory m) where
(MonoidAsCategory x) . (MonoidAsCategory y) = MonoidAsCategory (x <> y)
instance (Semigroup m, Monoid m) => Category (MonoidAsCategory m) where
id = MonoidAsCategory mempty