@@ -26,8 +26,8 @@ deriving instance Binary CaseAlt
2626!-}
2727
2828type CaseTree = SC
29−type Clause = ([Pat], Term)
30−type CS = Int
29+type Clause = ([Pat], (Term, Term))
30+type CS = ([Term], Int)
3131
3232-- simple terms can be inlined trivially - good for primitives in particular
3333small :: SC -> Bool
@@ -36,13 +36,13 @@ small _ = False
3636
3737simpleCase :: Bool -> Bool -> [(Term, Term)] -> CaseDef
3838simpleCase tc cover []
39− = CaseDef [] (UnmatchedCase "No pattern clauses")
39+ = CaseDef [] (UnmatchedCase "No pattern clauses") []
4040simpleCase tc cover cs
41− = let pats = map (\ (l, r) -> (toPats tc l, r)) cs
42− numargs = length (fst (head pats))
43− ns = take numargs args
44− tree = evalState (match ns pats (defaultCase cover)) numargs in
45− CaseDef ns (prune tree)
41+ = let pats = map (\ (l, r) -> (toPats tc l, (l, r))) cs
42+ numargs = length (fst (head pats))
43+ ns = take numargs args
44+ (tree, st) = runState (match ns pats (defaultCase cover)) ([], numargs) in
45+ CaseDef ns (prune tree) (fst st)
4646 where args = map (\i -> MN i "e") [0..]
4747 defaultCase True = STerm Erased
4848 defaultCase False = UnmatchedCase "Error"
@@ -109,8 +109,12 @@ partition xs = error $ "Partition " ++ show xs
109109
110110match :: [Name] -> [Clause] -> SC -- error case
111111 -> State CS SC
112−match [] (([], ret) : _) err = return $ STerm ret -- run out of arguments
113−match vs cs err = mixture vs (partition cs) err
112+match [] (([], ret) : xs) err
113+ = do (ts, v) <- get
114+ put (ts ++ (map (fst.snd) xs), v)
115+ return $ STerm (snd ret) -- run out of arguments
116+match vs cs err = do cs <- mixture vs (partition cs) err
117+ return cs
114118
115119mixture :: [Name] -> [Partition] -> SC -> State CS SC
116120mixture vs [] err = return err
@@ -166,7 +170,7 @@ argsToAlt rs@((r, m) : _)
166170 addRs ((r, (ps, res)) : rs) = ((r++ps, res) : addRs rs)
167171
168172getVar :: State CS Name
169−getVar = do v <- get; put (v+1); return (MN v "e")
173+getVar = do (t, v) <- get; put (t, v+1); return (MN v "e")
170174
171175groupCons :: [Clause] -> State CS [Group]
172176groupCons cs = gc [] cs
@@ -195,7 +199,7 @@ varRule (v : vs) alts err =
195199 do let alts' = map (repVar v) alts
196200 match vs alts' err
197201 where
198− repVar v (PV p : ps , res) = (ps, subst p (P Bound v (V 0)) res)
202+ repVar v (PV p : ps , (lhs, res)) = (ps, (lhs, subst p (P Bound v (V 0)) res))
199203 repVar v (PAny : ps , res) = (ps, res)
200204
201205prune :: SC -> SC