{-# LANGUAGE TypeFamilies           #-}
{-# LANGUAGE TypeInType             #-}
{-# LANGUAGE UndecidableInstances   #-}
{-# OPTIONS_GHC -Wall                       #-}
{-# OPTIONS_GHC -Werror=incomplete-patterns #-}

{-|
Module      : Fcf.Data.Tuple
Description : Type-level tuple functions
Copyright   : (c) gspia 2020-
License     : BSD
Maintainer  : gspia

= Fcf.Data.Tuple


-}

--------------------------------------------------------------------------------

module Fcf.Data.Tuple where

import           Fcf (Eval, Exp)

--------------------------------------------------------------------------------

-- For the doctests:

-- $setup
-- >>> import qualified GHC.TypeLits as TL

--------------------------------------------------------------------------------

-- | Swap
--
-- === __Example__
--
-- >>> :kind! Eval (Swap '(1, 2))
-- Eval (Swap '(1, 2)) :: (TL.Natural, TL.Natural)
-- = '(2, 1)
data Swap :: (a, b) -> Exp (b, a)
type instance Eval (Swap '(a,b)) = '(b,a)

-- | 2-tuple to allow for partial application of 2-tuple at the type level
data Tuple2 :: a -> b -> Exp (a, b)
type instance Eval (Tuple2 a b) = '(a,b)

-- | 3-tuple to allow for partial application of 3-tuple at the type level
data Tuple3 :: a -> b -> c -> Exp (a, b, c)
type instance Eval (Tuple3 a b c) = '(a,b,c)

-- | 4-tuple to allow for partial application of 4-tuple at the type level
data Tuple4 :: a -> b -> c -> d -> Exp (a, b, c, d)
type instance Eval (Tuple4 a b c d) = '(a,b,c,d)

-- | 5-tuple to allow for partial application of 4-tuple at the type level
data Tuple5 :: a -> b -> c -> d -> e -> Exp (a, b, c, d, e)
type instance Eval (Tuple5 a b c d e) = '(a,b,c,d,e)