{-# LANGUAGE CPP #-}
{-# 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
#ifdef MIN_VERSION_GLASGOW_HASKELL
#if MIN_VERSION_GLASGOW_HASKELL(7,10,2,0)
    {-# SPECIALIZE 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) #-}
#endif
#endif
    {-# INLINABLE desugar #-}
    {-# INLINABLE sugar #-}
    type Domain (a,b) = Domain a
    type Internal (a,b) =
        ( Internal a
        , Internal b
        )

    -- desugar = uncurryN $ sugarSymC Tup2
    desugar (a,b) = sugarSymC Tup2 a b
    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
--     {-# SPECIALIZE 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) #-}
--     {-# INLINABLE desugar #-}
--     {-# INLINABLE sugar #-}
--     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
--     {-# SPECIALIZE 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) #-}
--     {-# INLINABLE desugar #-}
--     {-# INLINABLE sugar #-}
--     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
--     {-# SPECIALIZE 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) #-}
--     {-# INLINABLE desugar #-}
--     {-# INLINABLE sugar #-}
--     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
--     {-# SPECIALIZE 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) #-}
--     {-# INLINABLE desugar #-}
--     {-# INLINABLE sugar #-}
--     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
--     {-# SPECIALIZE 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) #-}
--     {-# INLINABLE desugar #-}
--     {-# INLINABLE sugar #-}
--     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
--     {-# SPECIALIZE 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) #-}
--     {-# INLINABLE desugar #-}
--     {-# INLINABLE sugar #-}
--     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
--     {-# SPECIALIZE 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) #-}
--     {-# INLINABLE desugar #-}
--     {-# INLINABLE sugar #-}
--     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
--     {-# SPECIALIZE 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) #-}
--     {-# INLINABLE desugar #-}
--     {-# INLINABLE sugar #-}
--     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
--     {-# SPECIALIZE 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) #-}
--     {-# INLINABLE desugar #-}
--     {-# INLINABLE sugar #-}
--     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
--     {-# SPECIALIZE 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) #-}
--     {-# INLINABLE desugar #-}
--     {-# INLINABLE sugar #-}
--     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
--     {-# SPECIALIZE 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) #-}
--     {-# INLINABLE desugar #-}
--     {-# INLINABLE sugar #-}
--     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
--     {-# SPECIALIZE 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) #-}
--     {-# INLINABLE desugar #-}
--     {-# INLINABLE sugar #-}
--     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
--     {-# SPECIALIZE 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) #-}
--     {-# INLINABLE desugar #-}
--     {-# INLINABLE sugar #-}
--     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
--         )