{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}

module Freelude.Impl.CategoryAsMonoid (
  CategoryAsMonoid(getCategoryAsMonoid)
) where

import Prelude hiding ((.), id)
import Freelude.Impl.Classes
import Data.Semigroup (Semigroup((<>)))

newtype CategoryAsMonoid a = CategoryAsMonoid { getCategoryAsMonoid :: a }

instance (IsSemigroupoid t p a a) => Semigroup (CategoryAsMonoid t) where
  CategoryAsMonoid x <> CategoryAsMonoid y = CategoryAsMonoid (x . y)

instance (IsCategory t p a a, ExoIsCategory t p a a) => Monoid (CategoryAsMonoid t) where
  mempty = CategoryAsMonoid id
  mappend = (<>)