{-# LANGUAGE TemplateHaskell #-}

-- | Construction and elimination of tuples

module Language.Syntactic.Functional.Tuple
  ( module Language.Syntactic.Functional.Tuple
    -- * Template Haskell
  , eqPred
  , classPred
  , mkSelectClassPlusInstances
  , deriveSyntacticForTuples
  ) where



import Language.Syntactic
import Language.Syntactic.TH
import Language.Syntactic.Functional
import Language.Syntactic.Functional.Tuple.TH



--------------------------------------------------------------------------------
-- * Generic tuple projection
--------------------------------------------------------------------------------

mkSelectClassPlusInstances 15



--------------------------------------------------------------------------------
-- * Symbols
--------------------------------------------------------------------------------

-- | Construction and elimination of tuples
mkTupleSym "Tuple" "Tup" "Sel" 15

deriveSymbol    ''Tuple
deriveEquality  ''Tuple
deriveRender id ''Tuple

instance StringTree Tuple

instance Eval Tuple
  where
    evalSym Tup2  = (,)
    evalSym Tup3  = (,,)
    evalSym Tup4  = (,,,)
    evalSym Tup5  = (,,,,)
    evalSym Tup6  = (,,,,,)
    evalSym Tup7  = (,,,,,,)
    evalSym Tup8  = (,,,,,,,)
    evalSym Tup9  = (,,,,,,,,)
    evalSym Tup10 = (,,,,,,,,,)
    evalSym Tup11 = (,,,,,,,,,,)
    evalSym Tup12 = (,,,,,,,,,,,)
    evalSym Tup13 = (,,,,,,,,,,,,)
    evalSym Tup14 = (,,,,,,,,,,,,,)
    evalSym Tup15 = (,,,,,,,,,,,,,,)
    evalSym Sel1  = select1
    evalSym Sel2  = select2
    evalSym Sel3  = select3
    evalSym Sel4  = select4
    evalSym Sel5  = select5
    evalSym Sel6  = select6
    evalSym Sel7  = select7
    evalSym Sel8  = select8
    evalSym Sel9  = select9
    evalSym Sel10 = select10
    evalSym Sel11 = select11
    evalSym Sel12 = select12
    evalSym Sel13 = select13
    evalSym Sel14 = select14
    evalSym Sel15 = select15
  -- It would be possible to generate this instance, but the gain would be
  -- small, and it's very hard to get it wrong anyway.

instance EvalEnv Tuple env