@@ -29,6 +29,7 @@ type SC = SC' Term
29data CaseAlt' t = ConCase Name Int [Name] (SC' t)
29data CaseAlt' t = ConCase Name Int [Name] (SC' t)
30 | FnCase Name [Name] (SC' t) -- ^ reflection function
30 | FnCase Name [Name] (SC' t) -- ^ reflection function
31 | ConstCase Const (SC' t)
31 | ConstCase Const (SC' t)
32+ | SucCase Name (SC' t)
32 | DefaultCase (SC' t)
33 | DefaultCase (SC' t)
33 deriving (Show, Eq, Ord, Functor)
34 deriving (Show, Eq, Ord, Functor)
@@ -58,6 +59,8 @@ instance Show t => Show (SC' t) where
58 ++ show' (i+1) sc
59 ++ show' (i+1) sc
59 showA i (ConstCase t sc)
60 showA i (ConstCase t sc)
60 = show t ++ " => " ++ show' (i+1) sc
61 = show t ++ " => " ++ show' (i+1) sc
62+ showA i (SucCase n sc)
63+ = show n ++ "+1 => " ++ show' (i+1) sc
61 showA i (DefaultCase sc)
64 showA i (DefaultCase sc)
62 = "_ => " ++ show' (i+1) sc
65 = "_ => " ++ show' (i+1) sc
@@ -76,6 +79,7 @@ instance TermSize CaseAlt where
76 termsize n (ConCase _ _ _ s) = termsize n s
79 termsize n (ConCase _ _ _ s) = termsize n s
77 termsize n (FnCase _ _ s) = termsize n s
80 termsize n (FnCase _ _ s) = termsize n s
78 termsize n (ConstCase _ s) = termsize n s
81 termsize n (ConstCase _ s) = termsize n s
82+ termsize n (SucCase _ s) = termsize n s
79 termsize n (DefaultCase s) = termsize n s
83 termsize n (DefaultCase s) = termsize n s
81-- simple terms can be inlined trivially - good for primitives in particular
85-- simple terms can be inlined trivially - good for primitives in particular
@@ -98,6 +102,7 @@ namesUsed sc = nub $ nu' [] sc where
98 nua ps (ConCase n i args sc) = nub (nu' (ps ++ args) sc) \\ args
102 nua ps (ConCase n i args sc) = nub (nu' (ps ++ args) sc) \\ args
99 nua ps (FnCase n args sc) = nub (nu' (ps ++ args) sc) \\ args
103 nua ps (FnCase n args sc) = nub (nu' (ps ++ args) sc) \\ args
100 nua ps (ConstCase _ sc) = nu' ps sc
104 nua ps (ConstCase _ sc) = nu' ps sc
105+ nua ps (SucCase _ sc) = nu' ps sc
101 nua ps (DefaultCase sc) = nu' ps sc
106 nua ps (DefaultCase sc) = nu' ps sc
103 nut ps (P _ n _) | n `elem` ps = []
108 nut ps (P _ n _) | n `elem` ps = []
@@ -122,6 +127,7 @@ findCalls sc topargs = nub $ nu' topargs sc where
122 nua ps (ConCase n i args sc) = nub (nu' (ps ++ args) sc)
127 nua ps (ConCase n i args sc) = nub (nu' (ps ++ args) sc)
123 nua ps (FnCase n args sc) = nub (nu' (ps ++ args) sc)
128 nua ps (FnCase n args sc) = nub (nu' (ps ++ args) sc)
124 nua ps (ConstCase _ sc) = nu' ps sc
129 nua ps (ConstCase _ sc) = nu' ps sc
130+ nua ps (SucCase _ sc) = nu' ps sc
125 nua ps (DefaultCase sc) = nu' ps sc
131 nua ps (DefaultCase sc) = nu' ps sc
127 nut ps (P Ref n _) | n `elem` ps = []
133 nut ps (P Ref n _) | n `elem` ps = []
@@ -166,6 +172,7 @@ findAllUsedArgs sc topargs = filter (\x -> x `elem` topargs) (nu' sc) where
166 nua (ConCase n i args sc) = nu' sc
172 nua (ConCase n i args sc) = nu' sc
167 nua (FnCase n args sc) = nu' sc
173 nua (FnCase n args sc) = nu' sc
168 nua (ConstCase _ sc) = nu' sc
174 nua (ConstCase _ sc) = nu' sc
175+ nua (SucCase _ sc) = nu' sc
169 nua (DefaultCase sc) = nu' sc
176 nua (DefaultCase sc) = nu' sc
171data Phase = CompileTime | RunTime
178data Phase = CompileTime | RunTime
@@ -212,11 +219,13 @@ simpleCase tc cover reflect phase fc cs
212 acc [] n = Error (Inaccessible n)
219 acc [] n = Error (Inaccessible n)
213 acc (PV x : xs) n | x == n = OK ()
220 acc (PV x : xs) n | x == n = OK ()
214 acc (PCon _ _ ps : xs) n = acc (ps ++ xs) n
221 acc (PCon _ _ ps : xs) n = acc (ps ++ xs) n
222+ acc (PSuc p : xs) n = acc (p : xs) n
215 acc (_ : xs) n = acc xs n
223 acc (_ : xs) n = acc xs n
217data Pat = PCon Name Int [Pat]
225data Pat = PCon Name Int [Pat]
218 | PConst Const
226 | PConst Const
219 | PV Name
227 | PV Name
228+ | PSuc Pat -- special case for n+1 on Integer
220 | PReflected Name [Pat]
229 | PReflected Name [Pat]
222 deriving Show
231 deriving Show
@@ -234,6 +243,11 @@ toPat reflect tc tms = evalState (mapM (\x -> toPat' x []) tms) []
235 toPat' (P (DCon t a) n _) args = do args' <- mapM (\x -> toPat' x []) args
244 toPat' (P (DCon t a) n _) args = do args' <- mapM (\x -> toPat' x []) args
236 return $ PCon n t args'
245 return $ PCon n t args'
247+ toPat' (P _ (UN "prim__addBigInt") _)
248+ [p, Constant (BI 1)]
249+ = do p' <- toPat' p []
237 -- Typecase
251 -- Typecase
238 toPat' (P (TCon t a) n _) args | tc
252 toPat' (P (TCon t a) n _) args | tc
239 = do args' <- mapM (\x -> toPat' x []) args
253 = do args' <- mapM (\x -> toPat' x []) args
@@ -280,6 +294,7 @@ isVarPat _ = False
281isConPat (PCon _ _ _ : ps, _) = True
295isConPat (PCon _ _ _ : ps, _) = True
282isConPat (PReflected _ _ : ps, _) = True
296isConPat (PReflected _ _ : ps, _) = True
297+isConPat (PSuc _ : ps, _) = True
283isConPat (PConst _ : ps, _) = True
298isConPat (PConst _ : ps, _) = True
284isConPat _ = False
299isConPat _ = False
@@ -338,11 +353,13 @@ mixture vs (Vars ms : ps) err = do fallthrough <- mixture vs ps err
339data ConType = CName Name Int -- named constructor
354data ConType = CName Name Int -- named constructor
340 | CFn Name -- reflected function name
355 | CFn Name -- reflected function name
341 | CConst Const -- constant, not implemented yet
357 | CConst Const -- constant, not implemented yet
342− deriving Eq
358+ deriving (Show, Eq)
344data Group = ConGroup ConType -- Constructor
360data Group = ConGroup ConType -- Constructor
345 [([Pat], Clause)] -- arguments and rest of alternative
361 [([Pat], Clause)] -- arguments and rest of alternative
347conRule :: [Name] -> [Clause] -> SC -> State CS SC
364conRule :: [Name] -> [Clause] -> SC -> State CS SC
348conRule (v:vs) cs err = do groups <- groupCons cs
365conRule (v:vs) cs err = do groups <- groupCons cs
@@ -361,6 +378,10 @@ caseGroups (v:vs) gs err = do g <- altGroups gs
361 = do g <- altFnGroup n args
378 = do g <- altFnGroup n args
362 rest <- altGroups cs
379 rest <- altGroups cs
363 return (g : rest)
380 return (g : rest)
381+ altGroups (ConGroup CSuc args : cs)
382+ = do g <- altSucGroup args
383+ rest <- altGroups cs
364 altGroups (ConGroup (CConst c) args : cs)
385 altGroups (ConGroup (CConst c) args : cs)
365 = do g <- altConstGroup c args
386 = do g <- altConstGroup c args
366 rest <- altGroups cs
387 rest <- altGroups cs
@@ -372,6 +393,9 @@ caseGroups (v:vs) gs err = do g <- altGroups gs
372 altFnGroup n gs = do (newArgs, nextCs) <- argsToAlt gs
393 altFnGroup n gs = do (newArgs, nextCs) <- argsToAlt gs
373 matchCs <- match (newArgs ++ vs) nextCs err
394 matchCs <- match (newArgs ++ vs) nextCs err
374 return $ FnCase n newArgs matchCs
395 return $ FnCase n newArgs matchCs
396+ altSucGroup gs = do ([newArg], nextCs) <- argsToAlt gs
397+ matchCs <- match (newArg:vs) nextCs err
398+ return $ SucCase newArg matchCs
375 altConstGroup n gs = do (_, nextCs) <- argsToAlt gs
399 altConstGroup n gs = do (_, nextCs) <- argsToAlt gs
376 matchCs <- match vs nextCs err
400 matchCs <- match vs nextCs err
377 return $ ConstCase n matchCs
401 return $ ConstCase n matchCs
@@ -411,6 +435,7 @@ groupCons cs = gc [] cs
411 addGroup p ps res acc = case p of
435 addGroup p ps res acc = case p of
412 PCon con i args -> return $ addg (CName con i) args (ps, res) acc
436 PCon con i args -> return $ addg (CName con i) args (ps, res) acc
413 PConst cval -> return $ addConG cval (ps, res) acc
437 PConst cval -> return $ addConG cval (ps, res) acc
438+ PSuc n -> return $ addg CSuc [n] (ps, res) acc
414 PReflected fn args -> return $ addg (CFn fn) args (ps, res) acc
439 PReflected fn args -> return $ addg (CFn fn) args (ps, res) acc
415 pat -> fail $ show pat ++ " is not a constructor or constant (can't happen)"
440 pat -> fail $ show pat ++ " is not a constructor or constant (can't happen)"
@@ -423,7 +448,8 @@ groupCons cs = gc [] cs
423 addConG con res [] = [ConGroup (CConst con) [([], res)]]
448 addConG con res [] = [ConGroup (CConst con) [([], res)]]
424 addConG con res (g@(ConGroup (CConst n) cs) : gs)
449 addConG con res (g@(ConGroup (CConst n) cs) : gs)
425 | con == n = ConGroup (CConst n) (cs ++ [([], res)]) : gs
450 | con == n = ConGroup (CConst n) (cs ++ [([], res)]) : gs
426− | otherwise = g : addConG con res gs
451+-- | otherwise = g : addConG con res gs
452+ addConG con res (g : gs) = g : addConG con res gs
428varRule :: [Name] -> [Clause] -> SC -> State CS SC
454varRule :: [Name] -> [Clause] -> SC -> State CS SC
429varRule (v : vs) alts err =
455varRule (v : vs) alts err =
@@ -448,6 +474,7 @@ depatt ns tm = dp [] tm
448 dpa ms x (FnCase n args sc)
474 dpa ms x (FnCase n args sc)
449 = FnCase n args (dp ((x, (n, args)) : ms) sc)
475 = FnCase n args (dp ((x, (n, args)) : ms) sc)
450 dpa ms x (ConstCase c sc) = ConstCase c (dp ms sc)
476 dpa ms x (ConstCase c sc) = ConstCase c (dp ms sc)
477+ dpa ms x (SucCase n sc) = SucCase n (dp ms sc)
451 dpa ms x (DefaultCase sc) = DefaultCase (dp ms sc)
478 dpa ms x (DefaultCase sc) = DefaultCase (dp ms sc)
453 applyMaps ms f@(App _ _)
480 applyMaps ms f@(App _ _)
@@ -478,6 +505,7 @@ prune proj (Case n alts)
478 where pruneAlt (ConCase cn i ns sc) = ConCase cn i ns (prune proj sc)
505 where pruneAlt (ConCase cn i ns sc) = ConCase cn i ns (prune proj sc)
479 pruneAlt (FnCase cn ns sc) = FnCase cn ns (prune proj sc)
506 pruneAlt (FnCase cn ns sc) = FnCase cn ns (prune proj sc)
480 pruneAlt (ConstCase c sc) = ConstCase c (prune proj sc)
507 pruneAlt (ConstCase c sc) = ConstCase c (prune proj sc)
508+ pruneAlt (SucCase n sc) = SucCase n (prune proj sc)
481 pruneAlt (DefaultCase sc) = DefaultCase (prune proj sc)
509 pruneAlt (DefaultCase sc) = DefaultCase (prune proj sc)
483 notErased (DefaultCase (STerm Erased)) = False
511 notErased (DefaultCase (STerm Erased)) = False
@@ -503,6 +531,8 @@ prune proj (Case n alts)
503 = FnCase cn args (projRep arg n i rhs)
531 = FnCase cn args (projRep arg n i rhs)
504 projRepAlt arg n i (ConstCase t rhs)
532 projRepAlt arg n i (ConstCase t rhs)
505 = ConstCase t (projRep arg n i rhs)
533 = ConstCase t (projRep arg n i rhs)
534+ projRepAlt arg n i (SucCase sn rhs)
535+ = SucCase sn (projRep arg n i rhs)
506 projRepAlt arg n i (DefaultCase rhs)
536 projRepAlt arg n i (DefaultCase rhs)
507 = DefaultCase (projRep arg n i rhs)
537 = DefaultCase (projRep arg n i rhs)