[clean up generated code some, make it use 'if' statements rather than case statements when possible. get rid of unnecessary assignments on case statements
John Meacham <john@repetae.net>**20060128065156] hunk ./C/FromGrin.hs 238
-            let ass = mconcat [assign  a (project (arg i) tmp) | a <- as' | i <- [(1 :: Int) ..] ]
+                ass = mconcat [if needed a then assign  a' (project (arg i) tmp) else mempty | a' <- as' | a <- as | i <- [(1 :: Int) ..] ]
+                fve = freeVars e
+                needed (Var v _) = v `Set.member` fve
hunk ./C/FromGrin.hs 245
+convertBody (Case v@(Var _ t) [p1 :-> e1, p2 :-> e2]) | Set.null ((freeVars p2 :: Set.Set Var) `Set.intersection` freeVars e2) = do
+    scrut <- convertVal v
+    let ptrs = [Ty $ toAtom "HsPtr", Ty $ toAtom "HsFunPtr"]
+        scrut' = (if t `elem` ptrs then cast (basicType "uintptr_t") scrut else scrut)
+        cp (Lit i _) = constant (number $ fromIntegral i)
+        cp (Tag t) = constant (enum (nodeTagName t))
+    e1' <- convertBody e1
+    e2' <- convertBody e2
+    return $ profile_case_inc `mappend` cif (operator "==" (cp p1) scrut') e1' e2'
+
hunk ./C/Generate.hs 10
+    cif,
hunk ./C/Generate.hs 277
+
+
+cif :: Expression -> Statement -> Statement -> Statement
+cif exp thn els = SD $ do
+    thn <- draw thn
+    els <- draw els
+    exp <- draw exp
+    return $ text "if" <+> parens exp <+> lbrace <$> nest 4 thn <$> rbrace <+> text "else" <+> lbrace <$> nest 4 els <$> rbrace
+