module Acme.Unit where

import Control.Monad.Identity (Identity(Identity))

-- | /Generalized unit types/

class Unit t where
	unit :: t

instance Unit () where
	unit = ()

instance (Unit t, Unit u) => Unit (t, u) where
	unit = (unit, unit)

instance (Unit t, Unit u, Unit v) => Unit (t, u, v) where
	unit = (unit, unit, unit)

instance (Unit t, Unit u, Unit v, Unit w) => Unit (t, u, v, w) where
	unit = (unit, unit, unit, unit)

instance (Unit t, Unit u, Unit v, Unit w, Unit x) => Unit (t, u, v, w, x) where
	unit = (unit, unit, unit, unit, unit)

instance (Unit t) => Unit (Identity t) where
	unit = Identity unit

instance (Unit u) => Unit (t -> u) where
	unit = const unit