module Acme.Unit where
import Control.Monad.Identity (Identity(Identity))
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