{-# LANGUAGE TypeFamilies, TypeOperators, TemplateHaskell #-}
module Data.Tuple.Extra where

import Control.Monad ( forM )
import Data.Tuple.Template ( decTupleCons )

class TupleCons b where
  type (:|) a b :: *
  (|:|) :: a -> b -> a :| b
  split :: a :| b -> (a, b)

forM [3 .. 10] decTupleCons

newtype Tuple1 a = Tuple1 a
  deriving (Eq, Ord, Show)

instance TupleCons (Tuple1 a) where
   type (:|) b (Tuple1 a) = (b, a)
   {-# INLINE (|:|) #-}
   a |:| Tuple1 b = (a, b)
   {-# INLINE split #-}
   split (a, b) = (a, Tuple1 b)