{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses  #-}
{-# LANGUAGE FlexibleInstances      #-}
-- | Tuple utilities.
module Tuples where

-- | Class of tuples that can be expanded
--   by a single element.
class Annex c b a | c -> a, c -> b where
  annex :: b -> a -> c

instance Annex (a, b, c) (a, b) c where
  annex :: (a, b) -> c -> (a, b, c)
annex (a
a, b
b) c
c = (a
a, b
b, c
c)

instance Annex (a, b, c, d) (a, b, c) d where
  annex :: (a, b, c) -> d -> (a, b, c, d)
annex (a
a, b
b, c
c) d
d = (a
a, b
b, c
c, d
d)

instance Annex (a, b, c, d, e) (a, b, c, d) e where
  annex :: (a, b, c, d) -> e -> (a, b, c, d, e)
annex (a
a, b
b, c
c, d
d) e
e = (a
a, b
b, c
c, d
d, e
e)

instance Annex (a, b, c, d, e, f) (a, b, c, d, e) f where
  annex :: (a, b, c, d, e) -> f -> (a, b, c, d, e, f)
annex (a
a, b
b, c
c, d
d, e
e) f
f = (a
a, b
b, c
c, d
d, e
e, f
f)