{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses,
  TypeSynonymInstances, FlexibleContexts #-} 
                                                                                                    
-- | Functions to write imperative style csound code 
                                                     
module CsoundExpr.Base.Imperative (
    outList,
    ar,
    kr,
    ir,
    gar,
    gkr,
    gir,
    Assign(..))
where 
      
import CsoundExpr.Translator.Types
import CsoundExpr.Translator.Cs.IM
import CsoundExpr.Translator.Cs.CsTree
import CsoundExpr.Translator.ExprTree.ExprTree 
                                               
 
ar :: Name -> Arate
ar = argIn A 
             
 
kr :: Name -> Krate
kr = argIn K 
             
 
ir :: Name -> Irate
ir = argIn I 
             
 
gar :: Name -> Arate
gar = argIn GA 
               
 
gkr :: Name -> Krate
gkr = argIn GK 
               
 
gir :: Name -> Irate
gir = argIn GI 
               
 
fromArgIn :: (IM CsTree a) => a -> (Rate, Name)
fromArgIn a
  | isArg e = (argRate e, argName e)
  | otherwise =
    error "left hand side of <=> should be named expression"
  where e = exprOp $ exprTreeTag t
        t = to a :: CsTree 
 
-- Assign Class 
                
 
infixr 0 <=> 
               
 
class Assign a where
         
        (<=>) :: a -> a -> SignalOut 
                                                                      
 
instance Assign Arate where
        sig <=> expr
          = let (rate, name) = fromArgIn sig in
              SignalOut $ return $ argOut rate name expr 
                                                                                                                                                            
 
instance Assign Krate where
        sig <=> expr
          = let (rate, name) = fromArgIn sig in
              SignalOut $ return $ argOut rate name expr 
                                                                                                                                                            
 
instance Assign Irate where
        sig <=> expr
          = let (rate, name) = fromArgIn sig in
              SignalOut $ return $ argOut rate name expr 
                                                                                                                                                            
 
instance (Assign a) => Assign [a] where
        sigs <=> exprs = outList $ zipWith (<=>) sigs exprs 
                                                                                                      
 
instance (Assign a0, Assign a1) => Assign (a0, a1) where
        (sig0, sig1) <=> (exprs0, exprs1)
          = outList [sig0 <=> exprs0, sig1 <=> exprs1] 
                                                                                                                                                            
 
instance (Assign a0, Assign a1, Assign a2) => Assign (a0, a1, a2)
         where
        (sig0, sig1, sig2) <=> (exprs0, exprs1, exprs2)
          = outList [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2] 
                                                                                                                                                                                                                   
 
instance (Assign a0, Assign a1, Assign a2, Assign a3) => Assign
         (a0, a1, a2, a3) where
        (sig0, sig1, sig2, sig3) <=> (exprs0, exprs1, exprs2, exprs3)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3] 
                                                                                                                                                                                                                                                                                              
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4) =>
         Assign (a0, a1, a2, a3, a4) where
        (sig0, sig1, sig2, sig3, sig4) <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4] 
                                                                                                                                                                                                                                                                                                                                                      
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5) =>
         Assign (a0, a1, a2, a3, a4, a5) where
        (sig0, sig1, sig2, sig3, sig4, sig5) <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5] 
                                                                                                                                                                                                                                                                                                                                                                                                              
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6) =>
         Assign (a0, a1, a2, a3, a4, a5, a6) where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6) <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                            
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7) =>
         Assign (a0, a1, a2, a3, a4, a5, a6, a7) where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7) <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8) =>
         Assign (a0, a1, a2, a3, a4, a5, a6, a7, a8) where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8) <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9) =>
         Assign (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9) <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9,
          Assign a10) =>
         Assign (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11) =>
         Assign (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12) =>
         Assign (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13) =>
         Assign (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16, Assign a17) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16, sig17)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16, exprs17)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16, sig17 <=> exprs17] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16, Assign a17, Assign a18) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16, sig17, sig18)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16, exprs17, exprs18)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16, sig17 <=> exprs17, sig18 <=> exprs18] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16, Assign a17, Assign a18, Assign a19) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16, sig17, sig18, sig19)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16, exprs17, exprs18, exprs19)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16, sig17 <=> exprs17, sig18 <=> exprs18,
               sig19 <=> exprs19] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16, Assign a17, Assign a18, Assign a19, Assign a20) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16, sig17, sig18, sig19,
         sig20)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16, exprs17, exprs18, exprs19, exprs20)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16, sig17 <=> exprs17, sig18 <=> exprs18,
               sig19 <=> exprs19, sig20 <=> exprs20] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16, Assign a17, Assign a18, Assign a19, Assign a20,
          Assign a21) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16, sig17, sig18, sig19,
         sig20, sig21)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16, exprs17, exprs18, exprs19, exprs20, exprs21)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16, sig17 <=> exprs17, sig18 <=> exprs18,
               sig19 <=> exprs19, sig20 <=> exprs20, sig21 <=> exprs21] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16, Assign a17, Assign a18, Assign a19, Assign a20,
          Assign a21, Assign a22) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16, sig17, sig18, sig19,
         sig20, sig21, sig22)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16, exprs17, exprs18, exprs19, exprs20, exprs21,
           exprs22)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16, sig17 <=> exprs17, sig18 <=> exprs18,
               sig19 <=> exprs19, sig20 <=> exprs20, sig21 <=> exprs21,
               sig22 <=> exprs22] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16, Assign a17, Assign a18, Assign a19, Assign a20,
          Assign a21, Assign a22, Assign a23) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16, sig17, sig18, sig19,
         sig20, sig21, sig22, sig23)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16, exprs17, exprs18, exprs19, exprs20, exprs21,
           exprs22, exprs23)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16, sig17 <=> exprs17, sig18 <=> exprs18,
               sig19 <=> exprs19, sig20 <=> exprs20, sig21 <=> exprs21,
               sig22 <=> exprs22, sig23 <=> exprs23] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16, Assign a17, Assign a18, Assign a19, Assign a20,
          Assign a21, Assign a22, Assign a23, Assign a24) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16, sig17, sig18, sig19,
         sig20, sig21, sig22, sig23, sig24)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16, exprs17, exprs18, exprs19, exprs20, exprs21,
           exprs22, exprs23, exprs24)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16, sig17 <=> exprs17, sig18 <=> exprs18,
               sig19 <=> exprs19, sig20 <=> exprs20, sig21 <=> exprs21,
               sig22 <=> exprs22, sig23 <=> exprs23, sig24 <=> exprs24] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16, Assign a17, Assign a18, Assign a19, Assign a20,
          Assign a21, Assign a22, Assign a23, Assign a24, Assign a25) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16, sig17, sig18, sig19,
         sig20, sig21, sig22, sig23, sig24, sig25)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16, exprs17, exprs18, exprs19, exprs20, exprs21,
           exprs22, exprs23, exprs24, exprs25)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16, sig17 <=> exprs17, sig18 <=> exprs18,
               sig19 <=> exprs19, sig20 <=> exprs20, sig21 <=> exprs21,
               sig22 <=> exprs22, sig23 <=> exprs23, sig24 <=> exprs24,
               sig25 <=> exprs25] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16, Assign a17, Assign a18, Assign a19, Assign a20,
          Assign a21, Assign a22, Assign a23, Assign a24, Assign a25,
          Assign a26) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16, sig17, sig18, sig19,
         sig20, sig21, sig22, sig23, sig24, sig25, sig26)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16, exprs17, exprs18, exprs19, exprs20, exprs21,
           exprs22, exprs23, exprs24, exprs25, exprs26)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16, sig17 <=> exprs17, sig18 <=> exprs18,
               sig19 <=> exprs19, sig20 <=> exprs20, sig21 <=> exprs21,
               sig22 <=> exprs22, sig23 <=> exprs23, sig24 <=> exprs24,
               sig25 <=> exprs25, sig26 <=> exprs26] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16, Assign a17, Assign a18, Assign a19, Assign a20,
          Assign a21, Assign a22, Assign a23, Assign a24, Assign a25,
          Assign a26, Assign a27) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16, sig17, sig18, sig19,
         sig20, sig21, sig22, sig23, sig24, sig25, sig26, sig27)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16, exprs17, exprs18, exprs19, exprs20, exprs21,
           exprs22, exprs23, exprs24, exprs25, exprs26, exprs27)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16, sig17 <=> exprs17, sig18 <=> exprs18,
               sig19 <=> exprs19, sig20 <=> exprs20, sig21 <=> exprs21,
               sig22 <=> exprs22, sig23 <=> exprs23, sig24 <=> exprs24,
               sig25 <=> exprs25, sig26 <=> exprs26, sig27 <=> exprs27] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16, Assign a17, Assign a18, Assign a19, Assign a20,
          Assign a21, Assign a22, Assign a23, Assign a24, Assign a25,
          Assign a26, Assign a27, Assign a28) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27,
          a28)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16, sig17, sig18, sig19,
         sig20, sig21, sig22, sig23, sig24, sig25, sig26, sig27, sig28)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16, exprs17, exprs18, exprs19, exprs20, exprs21,
           exprs22, exprs23, exprs24, exprs25, exprs26, exprs27, exprs28)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16, sig17 <=> exprs17, sig18 <=> exprs18,
               sig19 <=> exprs19, sig20 <=> exprs20, sig21 <=> exprs21,
               sig22 <=> exprs22, sig23 <=> exprs23, sig24 <=> exprs24,
               sig25 <=> exprs25, sig26 <=> exprs26, sig27 <=> exprs27,
               sig28 <=> exprs28] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16, Assign a17, Assign a18, Assign a19, Assign a20,
          Assign a21, Assign a22, Assign a23, Assign a24, Assign a25,
          Assign a26, Assign a27, Assign a28, Assign a29) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27,
          a28, a29)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16, sig17, sig18, sig19,
         sig20, sig21, sig22, sig23, sig24, sig25, sig26, sig27, sig28,
         sig29)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16, exprs17, exprs18, exprs19, exprs20, exprs21,
           exprs22, exprs23, exprs24, exprs25, exprs26, exprs27, exprs28,
           exprs29)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16, sig17 <=> exprs17, sig18 <=> exprs18,
               sig19 <=> exprs19, sig20 <=> exprs20, sig21 <=> exprs21,
               sig22 <=> exprs22, sig23 <=> exprs23, sig24 <=> exprs24,
               sig25 <=> exprs25, sig26 <=> exprs26, sig27 <=> exprs27,
               sig28 <=> exprs28, sig29 <=> exprs29] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16, Assign a17, Assign a18, Assign a19, Assign a20,
          Assign a21, Assign a22, Assign a23, Assign a24, Assign a25,
          Assign a26, Assign a27, Assign a28, Assign a29, Assign a30) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27,
          a28, a29, a30)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16, sig17, sig18, sig19,
         sig20, sig21, sig22, sig23, sig24, sig25, sig26, sig27, sig28,
         sig29, sig30)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16, exprs17, exprs18, exprs19, exprs20, exprs21,
           exprs22, exprs23, exprs24, exprs25, exprs26, exprs27, exprs28,
           exprs29, exprs30)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16, sig17 <=> exprs17, sig18 <=> exprs18,
               sig19 <=> exprs19, sig20 <=> exprs20, sig21 <=> exprs21,
               sig22 <=> exprs22, sig23 <=> exprs23, sig24 <=> exprs24,
               sig25 <=> exprs25, sig26 <=> exprs26, sig27 <=> exprs27,
               sig28 <=> exprs28, sig29 <=> exprs29, sig30 <=> exprs30] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
 
instance (Assign a0, Assign a1, Assign a2, Assign a3, Assign a4,
          Assign a5, Assign a6, Assign a7, Assign a8, Assign a9, Assign a10,
          Assign a11, Assign a12, Assign a13, Assign a14, Assign a15,
          Assign a16, Assign a17, Assign a18, Assign a19, Assign a20,
          Assign a21, Assign a22, Assign a23, Assign a24, Assign a25,
          Assign a26, Assign a27, Assign a28, Assign a29, Assign a30,
          Assign a31) =>
         Assign
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27,
          a28, a29, a30, a31)
         where
        (sig0, sig1, sig2, sig3, sig4, sig5, sig6, sig7, sig8, sig9, sig10,
         sig11, sig12, sig13, sig14, sig15, sig16, sig17, sig18, sig19,
         sig20, sig21, sig22, sig23, sig24, sig25, sig26, sig27, sig28,
         sig29, sig30, sig31)
          <=>
          (exprs0, exprs1, exprs2, exprs3, exprs4, exprs5, exprs6, exprs7,
           exprs8, exprs9, exprs10, exprs11, exprs12, exprs13, exprs14,
           exprs15, exprs16, exprs17, exprs18, exprs19, exprs20, exprs21,
           exprs22, exprs23, exprs24, exprs25, exprs26, exprs27, exprs28,
           exprs29, exprs30, exprs31)
          = outList
              [sig0 <=> exprs0, sig1 <=> exprs1, sig2 <=> exprs2,
               sig3 <=> exprs3, sig4 <=> exprs4, sig5 <=> exprs5, sig6 <=> exprs6,
               sig7 <=> exprs7, sig8 <=> exprs8, sig9 <=> exprs9,
               sig10 <=> exprs10, sig11 <=> exprs11, sig12 <=> exprs12,
               sig13 <=> exprs13, sig14 <=> exprs14, sig15 <=> exprs15,
               sig16 <=> exprs16, sig17 <=> exprs17, sig18 <=> exprs18,
               sig19 <=> exprs19, sig20 <=> exprs20, sig21 <=> exprs21,
               sig22 <=> exprs22, sig23 <=> exprs23, sig24 <=> exprs24,
               sig25 <=> exprs25, sig26 <=> exprs26, sig27 <=> exprs27,
               sig28 <=> exprs28, sig29 <=> exprs29, sig30 <=> exprs30,
               sig31 <=> exprs31]