content: {-# LANGUAGE MultiParamTypeClasses #-}
  
  -- ----------------------------------------------------------------------------
  {- |
  'Bijection' instances represent a bijection between two types and allow conversion to and from.
  -}
  -- ----------------------------------------------------------------------------
  
  module Data.Bijection where
  
  -- | Bijection between two types @a@ and @b@.
  --   'to' and 'from' represent the bijective function.
  --
  -- For a proper bijection between x and y, two instances need to be defined (@Bijection x y@ and
  -- @Bijection y x@).
  class Bijection a b where
    to   :: a -> b
    from :: b -> a
  
  -- This works, but requires XFlexibleInstances XUndecidableInstances which causes errors not being
  -- checked by the compiler. Probably because the constraint is not smaller than the head (Paterson-
  -- Condition?), which is allowed with XUndecidableInstances.
  {-
  -- | Only one way needs to be defined.
  instance Bijection a b => Bijection b a where
    to   = from
    from = to
  -}
  
  -- ------------------------------------------------------------
  