{-# LANGUAGE UndecidableInstances #-}

-- | 'Syntactic' instances for Haskell tuples

module Language.Syntactic.Frontend.Tuple where



import Language.Syntactic
import Language.Syntactic.Constructs.Tuple
import Data.Tuple.Curry



instance
    ( Syntactic a, Domain a ~ dom
    , Syntactic b, Domain b ~ dom
    , InjectC Tuple dom
        ( Internal a
        , Internal b
        )
    , InjectC Select dom (Internal a)
    , InjectC Select dom (Internal b)
    ) =>
      Syntactic (a,b)
  where
    type Domain (a,b) = Domain a
    type Internal (a,b) =
        ( Internal a
        , Internal b
        )

    desugar = uncurryN $ sugarSymC Tup2
    sugar a =
        ( sugarSymC Sel1 a
        , sugarSymC Sel2 a
        )

instance
    ( Syntactic a, Domain a ~ dom
    , Syntactic b, Domain b ~ dom
    , Syntactic c, Domain c ~ dom
    , InjectC Tuple dom
        ( Internal a
        , Internal b
        , Internal c
        )
    , InjectC Select dom (Internal a)
    , InjectC Select dom (Internal b)
    , InjectC Select dom (Internal c)
    ) =>
      Syntactic (a,b,c)
  where
    type Domain (a,b,c) = Domain a
    type Internal (a,b,c) =
        ( Internal a
        , Internal b
        , Internal c
        )

    desugar = uncurryN $ sugarSymC Tup3
    sugar a =
        ( sugarSymC Sel1 a
        , sugarSymC Sel2 a
        , sugarSymC Sel3 a
        )

instance
    ( Syntactic a, Domain a ~ dom
    , Syntactic b, Domain b ~ dom
    , Syntactic c, Domain c ~ dom
    , Syntactic d, Domain d ~ dom
    , InjectC Tuple dom
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        )
    , InjectC Select dom (Internal a)
    , InjectC Select dom (Internal b)
    , InjectC Select dom (Internal c)
    , InjectC Select dom (Internal d)
    ) =>
      Syntactic (a,b,c,d)
  where
    type Domain (a,b,c,d) = Domain a
    type Internal (a,b,c,d) =
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        )

    desugar = uncurryN $ sugarSymC Tup4
    sugar a =
        ( sugarSymC Sel1 a
        , sugarSymC Sel2 a
        , sugarSymC Sel3 a
        , sugarSymC Sel4 a
        )

instance
    ( Syntactic a, Domain a ~ dom
    , Syntactic b, Domain b ~ dom
    , Syntactic c, Domain c ~ dom
    , Syntactic d, Domain d ~ dom
    , Syntactic e, Domain e ~ dom
    , InjectC Tuple dom
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        )
    , InjectC Select dom (Internal a)
    , InjectC Select dom (Internal b)
    , InjectC Select dom (Internal c)
    , InjectC Select dom (Internal d)
    , InjectC Select dom (Internal e)
    ) =>
      Syntactic (a,b,c,d,e)
  where
    type Domain (a,b,c,d,e) = Domain a
    type Internal (a,b,c,d,e) =
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        )

    desugar = uncurryN $ sugarSymC Tup5
    sugar a =
        ( sugarSymC Sel1 a
        , sugarSymC Sel2 a
        , sugarSymC Sel3 a
        , sugarSymC Sel4 a
        , sugarSymC Sel5 a
        )

instance
    ( Syntactic a, Domain a ~ dom
    , Syntactic b, Domain b ~ dom
    , Syntactic c, Domain c ~ dom
    , Syntactic d, Domain d ~ dom
    , Syntactic e, Domain e ~ dom
    , Syntactic f, Domain f ~ dom
    , InjectC Tuple dom
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        )
    , InjectC Select dom (Internal a)
    , InjectC Select dom (Internal b)
    , InjectC Select dom (Internal c)
    , InjectC Select dom (Internal d)
    , InjectC Select dom (Internal e)
    , InjectC Select dom (Internal f)
    ) =>
      Syntactic (a,b,c,d,e,f)
  where
    type Domain (a,b,c,d,e,f) = Domain a
    type Internal (a,b,c,d,e,f) =
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        )

    desugar = uncurryN $ sugarSymC Tup6
    sugar a =
        ( sugarSymC Sel1 a
        , sugarSymC Sel2 a
        , sugarSymC Sel3 a
        , sugarSymC Sel4 a
        , sugarSymC Sel5 a
        , sugarSymC Sel6 a
        )

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

    desugar = uncurryN $ sugarSymC Tup7
    sugar a =
        ( sugarSymC Sel1 a
        , sugarSymC Sel2 a
        , sugarSymC Sel3 a
        , sugarSymC Sel4 a
        , sugarSymC Sel5 a
        , sugarSymC Sel6 a
        , sugarSymC Sel7 a
        )

instance
    ( Syntactic a, Domain a ~ dom
    , Syntactic b, Domain b ~ dom
    , Syntactic c, Domain c ~ dom
    , Syntactic d, Domain d ~ dom
    , Syntactic e, Domain e ~ dom
    , Syntactic f, Domain f ~ dom
    , Syntactic g, Domain g ~ dom
    , Syntactic h, Domain h ~ dom
    , InjectC Tuple dom
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        )
    , InjectC Select dom (Internal a)
    , InjectC Select dom (Internal b)
    , InjectC Select dom (Internal c)
    , InjectC Select dom (Internal d)
    , InjectC Select dom (Internal e)
    , InjectC Select dom (Internal f)
    , InjectC Select dom (Internal g)
    , InjectC Select dom (Internal h)
    ) =>
      Syntactic (a,b,c,d,e,f,g,h)
  where
    type Domain (a,b,c,d,e,f,g,h) = Domain a
    type Internal (a,b,c,d,e,f,g,h) =
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        )

    desugar = uncurryN $ sugarSymC Tup8
    sugar a =
        ( sugarSymC Sel1 a
        , sugarSymC Sel2 a
        , sugarSymC Sel3 a
        , sugarSymC Sel4 a
        , sugarSymC Sel5 a
        , sugarSymC Sel6 a
        , sugarSymC Sel7 a
        , sugarSymC Sel8 a
        )

instance
    ( Syntactic a, Domain a ~ dom
    , Syntactic b, Domain b ~ dom
    , Syntactic c, Domain c ~ dom
    , Syntactic d, Domain d ~ dom
    , Syntactic e, Domain e ~ dom
    , Syntactic f, Domain f ~ dom
    , Syntactic g, Domain g ~ dom
    , Syntactic h, Domain h ~ dom
    , Syntactic i, Domain i ~ dom
    , InjectC Tuple dom
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        , Internal i
        )
    , InjectC Select dom (Internal a)
    , InjectC Select dom (Internal b)
    , InjectC Select dom (Internal c)
    , InjectC Select dom (Internal d)
    , InjectC Select dom (Internal e)
    , InjectC Select dom (Internal f)
    , InjectC Select dom (Internal g)
    , InjectC Select dom (Internal h)
    , InjectC Select dom (Internal i)
    ) =>
      Syntactic (a,b,c,d,e,f,g,h,i)
  where
    type Domain (a,b,c,d,e,f,g,h,i) = Domain a
    type Internal (a,b,c,d,e,f,g,h,i) =
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        , Internal i
        )

    desugar = uncurryN $ sugarSymC Tup9
    sugar a =
        ( sugarSymC Sel1 a
        , sugarSymC Sel2 a
        , sugarSymC Sel3 a
        , sugarSymC Sel4 a
        , sugarSymC Sel5 a
        , sugarSymC Sel6 a
        , sugarSymC Sel7 a
        , sugarSymC Sel8 a
        , sugarSymC Sel9 a
        )

instance
    ( Syntactic a, Domain a ~ dom
    , Syntactic b, Domain b ~ dom
    , Syntactic c, Domain c ~ dom
    , Syntactic d, Domain d ~ dom
    , Syntactic e, Domain e ~ dom
    , Syntactic f, Domain f ~ dom
    , Syntactic g, Domain g ~ dom
    , Syntactic h, Domain h ~ dom
    , Syntactic i, Domain i ~ dom
    , Syntactic j, Domain j ~ dom
    , InjectC Tuple dom
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        , Internal i
        , Internal j
        )
    , InjectC Select dom (Internal a)
    , InjectC Select dom (Internal b)
    , InjectC Select dom (Internal c)
    , InjectC Select dom (Internal d)
    , InjectC Select dom (Internal e)
    , InjectC Select dom (Internal f)
    , InjectC Select dom (Internal g)
    , InjectC Select dom (Internal h)
    , InjectC Select dom (Internal i)
    , InjectC Select dom (Internal j)
    ) =>
      Syntactic (a,b,c,d,e,f,g,h,i,j)
  where
    type Domain (a,b,c,d,e,f,g,h,i,j) = Domain a
    type Internal (a,b,c,d,e,f,g,h,i,j) =
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        , Internal i
        , Internal j
        )

    desugar = uncurryN $ sugarSymC Tup10
    sugar a =
        ( sugarSymC Sel1 a
        , sugarSymC Sel2 a
        , sugarSymC Sel3 a
        , sugarSymC Sel4 a
        , sugarSymC Sel5 a
        , sugarSymC Sel6 a
        , sugarSymC Sel7 a
        , sugarSymC Sel8 a
        , sugarSymC Sel9 a
        , sugarSymC Sel10 a
        )

instance
    ( Syntactic a, Domain a ~ dom
    , Syntactic b, Domain b ~ dom
    , Syntactic c, Domain c ~ dom
    , Syntactic d, Domain d ~ dom
    , Syntactic e, Domain e ~ dom
    , Syntactic f, Domain f ~ dom
    , Syntactic g, Domain g ~ dom
    , Syntactic h, Domain h ~ dom
    , Syntactic i, Domain i ~ dom
    , Syntactic j, Domain j ~ dom
    , Syntactic k, Domain k ~ dom
    , InjectC Tuple dom
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        , Internal i
        , Internal j
        , Internal k
        )
    , InjectC Select dom (Internal a)
    , InjectC Select dom (Internal b)
    , InjectC Select dom (Internal c)
    , InjectC Select dom (Internal d)
    , InjectC Select dom (Internal e)
    , InjectC Select dom (Internal f)
    , InjectC Select dom (Internal g)
    , InjectC Select dom (Internal h)
    , InjectC Select dom (Internal i)
    , InjectC Select dom (Internal j)
    , InjectC Select dom (Internal k)
    ) =>
      Syntactic (a,b,c,d,e,f,g,h,i,j,k)
  where
    type Domain (a,b,c,d,e,f,g,h,i,j,k) = Domain a
    type Internal (a,b,c,d,e,f,g,h,i,j,k) =
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        , Internal i
        , Internal j
        , Internal k
        )

    desugar = uncurryN $ sugarSymC Tup11
    sugar a =
        ( sugarSymC Sel1 a
        , sugarSymC Sel2 a
        , sugarSymC Sel3 a
        , sugarSymC Sel4 a
        , sugarSymC Sel5 a
        , sugarSymC Sel6 a
        , sugarSymC Sel7 a
        , sugarSymC Sel8 a
        , sugarSymC Sel9 a
        , sugarSymC Sel10 a
        , sugarSymC Sel11 a
        )

instance
    ( Syntactic a, Domain a ~ dom
    , Syntactic b, Domain b ~ dom
    , Syntactic c, Domain c ~ dom
    , Syntactic d, Domain d ~ dom
    , Syntactic e, Domain e ~ dom
    , Syntactic f, Domain f ~ dom
    , Syntactic g, Domain g ~ dom
    , Syntactic h, Domain h ~ dom
    , Syntactic i, Domain i ~ dom
    , Syntactic j, Domain j ~ dom
    , Syntactic k, Domain k ~ dom
    , Syntactic l, Domain l ~ dom
    , InjectC Tuple dom
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        , Internal i
        , Internal j
        , Internal k
        , Internal l
        )
    , InjectC Select dom (Internal a)
    , InjectC Select dom (Internal b)
    , InjectC Select dom (Internal c)
    , InjectC Select dom (Internal d)
    , InjectC Select dom (Internal e)
    , InjectC Select dom (Internal f)
    , InjectC Select dom (Internal g)
    , InjectC Select dom (Internal h)
    , InjectC Select dom (Internal i)
    , InjectC Select dom (Internal j)
    , InjectC Select dom (Internal k)
    , InjectC Select dom (Internal l)
    ) =>
      Syntactic (a,b,c,d,e,f,g,h,i,j,k,l)
  where
    type Domain (a,b,c,d,e,f,g,h,i,j,k,l) = Domain a
    type Internal (a,b,c,d,e,f,g,h,i,j,k,l) =
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        , Internal i
        , Internal j
        , Internal k
        , Internal l
        )

    desugar = uncurryN $ sugarSymC Tup12
    sugar a =
        ( sugarSymC Sel1 a
        , sugarSymC Sel2 a
        , sugarSymC Sel3 a
        , sugarSymC Sel4 a
        , sugarSymC Sel5 a
        , sugarSymC Sel6 a
        , sugarSymC Sel7 a
        , sugarSymC Sel8 a
        , sugarSymC Sel9 a
        , sugarSymC Sel10 a
        , sugarSymC Sel11 a
        , sugarSymC Sel12 a
        )

instance
    ( Syntactic a, Domain a ~ dom
    , Syntactic b, Domain b ~ dom
    , Syntactic c, Domain c ~ dom
    , Syntactic d, Domain d ~ dom
    , Syntactic e, Domain e ~ dom
    , Syntactic f, Domain f ~ dom
    , Syntactic g, Domain g ~ dom
    , Syntactic h, Domain h ~ dom
    , Syntactic i, Domain i ~ dom
    , Syntactic j, Domain j ~ dom
    , Syntactic k, Domain k ~ dom
    , Syntactic l, Domain l ~ dom
    , Syntactic m, Domain m ~ dom
    , InjectC Tuple dom
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        , Internal i
        , Internal j
        , Internal k
        , Internal l
        , Internal m
        )
    , InjectC Select dom (Internal a)
    , InjectC Select dom (Internal b)
    , InjectC Select dom (Internal c)
    , InjectC Select dom (Internal d)
    , InjectC Select dom (Internal e)
    , InjectC Select dom (Internal f)
    , InjectC Select dom (Internal g)
    , InjectC Select dom (Internal h)
    , InjectC Select dom (Internal i)
    , InjectC Select dom (Internal j)
    , InjectC Select dom (Internal k)
    , InjectC Select dom (Internal l)
    , InjectC Select dom (Internal m)
    ) =>
      Syntactic (a,b,c,d,e,f,g,h,i,j,k,l,m)
  where
    type Domain (a,b,c,d,e,f,g,h,i,j,k,l,m) = Domain a
    type Internal (a,b,c,d,e,f,g,h,i,j,k,l,m) =
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        , Internal i
        , Internal j
        , Internal k
        , Internal l
        , Internal m
        )

    desugar = uncurryN $ sugarSymC Tup13
    sugar a =
        ( sugarSymC Sel1 a
        , sugarSymC Sel2 a
        , sugarSymC Sel3 a
        , sugarSymC Sel4 a
        , sugarSymC Sel5 a
        , sugarSymC Sel6 a
        , sugarSymC Sel7 a
        , sugarSymC Sel8 a
        , sugarSymC Sel9 a
        , sugarSymC Sel10 a
        , sugarSymC Sel11 a
        , sugarSymC Sel12 a
        , sugarSymC Sel13 a
        )

instance
    ( Syntactic a, Domain a ~ dom
    , Syntactic b, Domain b ~ dom
    , Syntactic c, Domain c ~ dom
    , Syntactic d, Domain d ~ dom
    , Syntactic e, Domain e ~ dom
    , Syntactic f, Domain f ~ dom
    , Syntactic g, Domain g ~ dom
    , Syntactic h, Domain h ~ dom
    , Syntactic i, Domain i ~ dom
    , Syntactic j, Domain j ~ dom
    , Syntactic k, Domain k ~ dom
    , Syntactic l, Domain l ~ dom
    , Syntactic m, Domain m ~ dom
    , Syntactic n, Domain n ~ dom
    , InjectC Tuple dom
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        , Internal i
        , Internal j
        , Internal k
        , Internal l
        , Internal m
        , Internal n
        )
    , InjectC Select dom (Internal a)
    , InjectC Select dom (Internal b)
    , InjectC Select dom (Internal c)
    , InjectC Select dom (Internal d)
    , InjectC Select dom (Internal e)
    , InjectC Select dom (Internal f)
    , InjectC Select dom (Internal g)
    , InjectC Select dom (Internal h)
    , InjectC Select dom (Internal i)
    , InjectC Select dom (Internal j)
    , InjectC Select dom (Internal k)
    , InjectC Select dom (Internal l)
    , InjectC Select dom (Internal m)
    , InjectC Select dom (Internal n)
    ) =>
      Syntactic (a,b,c,d,e,f,g,h,i,j,k,l,m,n)
  where
    type Domain (a,b,c,d,e,f,g,h,i,j,k,l,m,n) = Domain a
    type Internal (a,b,c,d,e,f,g,h,i,j,k,l,m,n) =
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        , Internal i
        , Internal j
        , Internal k
        , Internal l
        , Internal m
        , Internal n
        )

    desugar = uncurryN $ sugarSymC Tup14
    sugar a =
        ( sugarSymC Sel1 a
        , sugarSymC Sel2 a
        , sugarSymC Sel3 a
        , sugarSymC Sel4 a
        , sugarSymC Sel5 a
        , sugarSymC Sel6 a
        , sugarSymC Sel7 a
        , sugarSymC Sel8 a
        , sugarSymC Sel9 a
        , sugarSymC Sel10 a
        , sugarSymC Sel11 a
        , sugarSymC Sel12 a
        , sugarSymC Sel13 a
        , sugarSymC Sel14 a
        )


instance
    ( Syntactic a, Domain a ~ dom
    , Syntactic b, Domain b ~ dom
    , Syntactic c, Domain c ~ dom
    , Syntactic d, Domain d ~ dom
    , Syntactic e, Domain e ~ dom
    , Syntactic f, Domain f ~ dom
    , Syntactic g, Domain g ~ dom
    , Syntactic h, Domain h ~ dom
    , Syntactic i, Domain i ~ dom
    , Syntactic j, Domain j ~ dom
    , Syntactic k, Domain k ~ dom
    , Syntactic l, Domain l ~ dom
    , Syntactic m, Domain m ~ dom
    , Syntactic n, Domain n ~ dom
    , Syntactic o, Domain o ~ dom
    , InjectC Tuple dom
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        , Internal i
        , Internal j
        , Internal k
        , Internal l
        , Internal m
        , Internal n
        , Internal o
        )
    , InjectC Select dom (Internal a)
    , InjectC Select dom (Internal b)
    , InjectC Select dom (Internal c)
    , InjectC Select dom (Internal d)
    , InjectC Select dom (Internal e)
    , InjectC Select dom (Internal f)
    , InjectC Select dom (Internal g)
    , InjectC Select dom (Internal h)
    , InjectC Select dom (Internal i)
    , InjectC Select dom (Internal j)
    , InjectC Select dom (Internal k)
    , InjectC Select dom (Internal l)
    , InjectC Select dom (Internal m)
    , InjectC Select dom (Internal n)
    , InjectC Select dom (Internal o)
    ) =>
      Syntactic (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o)
  where
    type Domain (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) = Domain a
    type Internal (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) =
        ( Internal a
        , Internal b
        , Internal c
        , Internal d
        , Internal e
        , Internal f
        , Internal g
        , Internal h
        , Internal i
        , Internal j
        , Internal k
        , Internal l
        , Internal m
        , Internal n
        , Internal o
        )

    desugar = uncurryN $ sugarSymC Tup15
    sugar a =
        ( sugarSymC Sel1 a
        , sugarSymC Sel2 a
        , sugarSymC Sel3 a
        , sugarSymC Sel4 a
        , sugarSymC Sel5 a
        , sugarSymC Sel6 a
        , sugarSymC Sel7 a
        , sugarSymC Sel8 a
        , sugarSymC Sel9 a
        , sugarSymC Sel10 a
        , sugarSymC Sel11 a
        , sugarSymC Sel12 a
        , sugarSymC Sel13 a
        , sugarSymC Sel14 a
        , sugarSymC Sel15 a
        )