@@ -29,6 +29,7 @@ type SC = SC' Term
2929data CaseAlt' t = ConCase Name Int [Name] (SC' t)
3030 | FnCase Name [Name] (SC' t) -- ^ reflection function
3131 | ConstCase Const (SC' t)
32+ | SucCase Name (SC' t)
3233 | DefaultCase (SC' t)
3334 deriving (Show, Eq, Ord, Functor)
3435{-!
@@ -58,6 +59,8 @@ instance Show t => Show (SC' t) where
5859 ++ show' (i+1) sc
5960 showA i (ConstCase t sc)
6061 = show t ++ " => " ++ show' (i+1) sc
62+ showA i (SucCase n sc)
63+ = show n ++ "+1 => " ++ show' (i+1) sc
6164 showA i (DefaultCase sc)
6265 = "_ => " ++ show' (i+1) sc
6366
@@ -76,6 +79,7 @@ instance TermSize CaseAlt where
7679 termsize n (ConCase _ _ _ s) = termsize n s
7780 termsize n (FnCase _ _ s) = termsize n s
7881 termsize n (ConstCase _ s) = termsize n s
82+ termsize n (SucCase _ s) = termsize n s
7983 termsize n (DefaultCase s) = termsize n s
8084
8185-- simple terms can be inlined trivially - good for primitives in particular
@@ -98,6 +102,7 @@ namesUsed sc = nub $ nu' [] sc where
98102 nua ps (ConCase n i args sc) = nub (nu' (ps ++ args) sc) \\ args
99103 nua ps (FnCase n args sc) = nub (nu' (ps ++ args) sc) \\ args
100104 nua ps (ConstCase _ sc) = nu' ps sc
105+ nua ps (SucCase _ sc) = nu' ps sc
101106 nua ps (DefaultCase sc) = nu' ps sc
102107
103108 nut ps (P _ n _) | n `elem` ps = []
@@ -122,6 +127,7 @@ findCalls sc topargs = nub $ nu' topargs sc where
122127 nua ps (ConCase n i args sc) = nub (nu' (ps ++ args) sc)
123128 nua ps (FnCase n args sc) = nub (nu' (ps ++ args) sc)
124129 nua ps (ConstCase _ sc) = nu' ps sc
130+ nua ps (SucCase _ sc) = nu' ps sc
125131 nua ps (DefaultCase sc) = nu' ps sc
126132
127133 nut ps (P Ref n _) | n `elem` ps = []
@@ -166,6 +172,7 @@ findAllUsedArgs sc topargs = filter (\x -> x `elem` topargs) (nu' sc) where
166172 nua (ConCase n i args sc) = nu' sc
167173 nua (FnCase n args sc) = nu' sc
168174 nua (ConstCase _ sc) = nu' sc
175+ nua (SucCase _ sc) = nu' sc
169176 nua (DefaultCase sc) = nu' sc
170177
171178data Phase = CompileTime | RunTime
@@ -212,11 +219,13 @@ simpleCase tc cover reflect phase fc cs
212219 acc [] n = Error (Inaccessible n)
213220 acc (PV x : xs) n | x == n = OK ()
214221 acc (PCon _ _ ps : xs) n = acc (ps ++ xs) n
222+ acc (PSuc p : xs) n = acc (p : xs) n
215223 acc (_ : xs) n = acc xs n
216224
217225data Pat = PCon Name Int [Pat]
218226 | PConst Const
219227 | PV Name
228+ | PSuc Pat -- special case for n+1 on Integer
220229 | PReflected Name [Pat]
221230 | PAny
222231 deriving Show
@@ -234,6 +243,11 @@ toPat reflect tc tms = evalState (mapM (\x -> toPat' x []) tms) []
234243 where
235244 toPat' (P (DCon t a) n _) args = do args' <- mapM (\x -> toPat' x []) args
236245 return $ PCon n t args'
246+ -- n + 1
247+ toPat' (P _ (UN "prim__addBigInt") _)
248+ [p, Constant (BI 1)]
249+ = do p' <- toPat' p []
250+ return $ PSuc p'
237251 -- Typecase
238252 toPat' (P (TCon t a) n _) args | tc
239253 = do args' <- mapM (\x -> toPat' x []) args
@@ -280,6 +294,7 @@ isVarPat _ = False
280294
281295isConPat (PCon _ _ _ : ps, _) = True
282296isConPat (PReflected _ _ : ps, _) = True
297+isConPat (PSuc _ : ps, _) = True
283298isConPat (PConst _ : ps, _) = True
284299isConPat _ = False
285300
@@ -338,11 +353,13 @@ mixture vs (Vars ms : ps) err = do fallthrough <- mixture vs ps err
338353
339354data ConType = CName Name Int -- named constructor
340355 | CFn Name -- reflected function name
356+ | CSuc -- n+1
341357 | CConst Const -- constant, not implemented yet
342− deriving Eq
358+ deriving (Show, Eq)
343359
344360data Group = ConGroup ConType -- Constructor
345361 [([Pat], Clause)] -- arguments and rest of alternative
362+ deriving Show
346363
347364conRule :: [Name] -> [Clause] -> SC -> State CS SC
348365conRule (v:vs) cs err = do groups <- groupCons cs
@@ -361,6 +378,10 @@ caseGroups (v:vs) gs err = do g <- altGroups gs
361378 = do g <- altFnGroup n args
362379 rest <- altGroups cs
363380 return (g : rest)
381+ altGroups (ConGroup CSuc args : cs)
382+ = do g <- altSucGroup args
383+ rest <- altGroups cs
384+ return (g : rest)
364385 altGroups (ConGroup (CConst c) args : cs)
365386 = do g <- altConstGroup c args
366387 rest <- altGroups cs
@@ -372,6 +393,9 @@ caseGroups (v:vs) gs err = do g <- altGroups gs
372393 altFnGroup n gs = do (newArgs, nextCs) <- argsToAlt gs
373394 matchCs <- match (newArgs ++ vs) nextCs err
374395 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
375399 altConstGroup n gs = do (_, nextCs) <- argsToAlt gs
376400 matchCs <- match vs nextCs err
377401 return $ ConstCase n matchCs
@@ -411,6 +435,7 @@ groupCons cs = gc [] cs
411435 addGroup p ps res acc = case p of
412436 PCon con i args -> return $ addg (CName con i) args (ps, res) acc
413437 PConst cval -> return $ addConG cval (ps, res) acc
438+ PSuc n -> return $ addg CSuc [n] (ps, res) acc
414439 PReflected fn args -> return $ addg (CFn fn) args (ps, res) acc
415440 pat -> fail $ show pat ++ " is not a constructor or constant (can't happen)"
416441
@@ -423,7 +448,8 @@ groupCons cs = gc [] cs
423448 addConG con res [] = [ConGroup (CConst con) [([], res)]]
424449 addConG con res (g@(ConGroup (CConst n) cs) : gs)
425450 | 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
427453
428454varRule :: [Name] -> [Clause] -> SC -> State CS SC
429455varRule (v : vs) alts err =
@@ -448,6 +474,7 @@ depatt ns tm = dp [] tm
448474 dpa ms x (FnCase n args sc)
449475 = FnCase n args (dp ((x, (n, args)) : ms) sc)
450476 dpa ms x (ConstCase c sc) = ConstCase c (dp ms sc)
477+ dpa ms x (SucCase n sc) = SucCase n (dp ms sc)
451478 dpa ms x (DefaultCase sc) = DefaultCase (dp ms sc)
452479
453480 applyMaps ms f@(App _ _)
@@ -478,6 +505,7 @@ prune proj (Case n alts)
478505 where pruneAlt (ConCase cn i ns sc) = ConCase cn i ns (prune proj sc)
479506 pruneAlt (FnCase cn ns sc) = FnCase cn ns (prune proj sc)
480507 pruneAlt (ConstCase c sc) = ConstCase c (prune proj sc)
508+ pruneAlt (SucCase n sc) = SucCase n (prune proj sc)
481509 pruneAlt (DefaultCase sc) = DefaultCase (prune proj sc)
482510
483511 notErased (DefaultCase (STerm Erased)) = False
@@ -503,6 +531,8 @@ prune proj (Case n alts)
503531 = FnCase cn args (projRep arg n i rhs)
504532 projRepAlt arg n i (ConstCase t rhs)
505533 = ConstCase t (projRep arg n i rhs)
534+ projRepAlt arg n i (SucCase sn rhs)
535+ = SucCase sn (projRep arg n i rhs)
506536 projRepAlt arg n i (DefaultCase rhs)
507537 = DefaultCase (projRep arg n i rhs)
508538