{-# LANGUAGE UndecidableInstances #-}

-- | 'Syntactic' instances for tuples
module Language.Syntactic.Features.TupleSyntactic where



import Language.Syntactic.Syntax
import Language.Syntactic.Features.Tuple



instance
    ( Syntactic a dom
    , Syntactic b dom
    , Tuple  :<: dom
    , Select :<: dom
    ) =>
      Syntactic (a,b) dom
  where
    type Internal (a,b) =
        ( Internal a
        , Internal b
        )

    desugar (a,b) = inject Tup2
        :$: desugar a
        :$: desugar b

    sugar a =
        ( sugar $ inject Sel1 :$: a
        , sugar $ inject Sel2 :$: a
        )

instance
    ( Syntactic a dom
    , Syntactic b dom
    , Syntactic c dom
    , Tuple  :<: dom
    , Select :<: dom
    ) =>
      Syntactic (a,b,c) dom
  where
    type Internal (a,b,c) =
        ( Internal a
        , Internal b
        , Internal c
        )

    desugar (a,b,c) = inject Tup3
        :$: desugar a
        :$: desugar b
        :$: desugar c

    sugar a =
        ( sugar $ inject Sel1 :$: a
        , sugar $ inject Sel2 :$: a
        , sugar $ inject Sel3 :$: a
        )

instance
    ( Syntactic a dom
    , Syntactic b dom
    , Syntactic c dom
    , Syntactic d dom
    , Tuple  :<: dom
    , Select :<: dom
    ) =>
      Syntactic (a,b,c,d) dom
  where
    type Internal (a,b,c,d) =
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        )

    desugar (a,b,c,d) = inject Tup4
        :$: desugar a
        :$: desugar b
        :$: desugar c
        :$: desugar d

    sugar a =
        ( sugar $ inject Sel1 :$: a
        , sugar $ inject Sel2 :$: a
        , sugar $ inject Sel3 :$: a
        , sugar $ inject Sel4 :$: a
        )

instance
    ( Syntactic a dom
    , Syntactic b dom
    , Syntactic c dom
    , Syntactic d dom
    , Syntactic e dom
    , Tuple  :<: dom
    , Select :<: dom
    ) =>
      Syntactic (a,b,c,d,e) dom
  where
    type Internal (a,b,c,d,e) =
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        )

    desugar (a,b,c,d,e) = inject Tup5
        :$: desugar a
        :$: desugar b
        :$: desugar c
        :$: desugar d
        :$: desugar e

    sugar a =
        ( sugar $ inject Sel1 :$: a
        , sugar $ inject Sel2 :$: a
        , sugar $ inject Sel3 :$: a
        , sugar $ inject Sel4 :$: a
        , sugar $ inject Sel5 :$: a
        )

instance
    ( Syntactic a dom
    , Syntactic b dom
    , Syntactic c dom
    , Syntactic d dom
    , Syntactic e dom
    , Syntactic f dom
    , Tuple  :<: dom
    , Select :<: dom
    ) =>
      Syntactic (a,b,c,d,e,f) dom
  where
    type Internal (a,b,c,d,e,f) =
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        )

    desugar (a,b,c,d,e,f) = inject Tup6
        :$: desugar a
        :$: desugar b
        :$: desugar c
        :$: desugar d
        :$: desugar e
        :$: desugar f

    sugar a =
        ( sugar $ inject Sel1 :$: a
        , sugar $ inject Sel2 :$: a
        , sugar $ inject Sel3 :$: a
        , sugar $ inject Sel4 :$: a
        , sugar $ inject Sel5 :$: a
        , sugar $ inject Sel6 :$: a
        )

instance
    ( Syntactic a dom
    , Syntactic b dom
    , Syntactic c dom
    , Syntactic d dom
    , Syntactic e dom
    , Syntactic f dom
    , Syntactic g dom
    , Tuple  :<: dom
    , Select :<: dom
    ) =>
      Syntactic (a,b,c,d,e,f,g) dom
  where
    type Internal (a,b,c,d,e,f,g) =
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        )

    desugar (a,b,c,d,e,f,g) = inject Tup7
        :$: desugar a
        :$: desugar b
        :$: desugar c
        :$: desugar d
        :$: desugar e
        :$: desugar f
        :$: desugar g

    sugar a =
        ( sugar $ inject Sel1 :$: a
        , sugar $ inject Sel2 :$: a
        , sugar $ inject Sel3 :$: a
        , sugar $ inject Sel4 :$: a
        , sugar $ inject Sel5 :$: a
        , sugar $ inject Sel6 :$: a
        , sugar $ inject Sel7 :$: a
        )