@@ -283,7 +283,10 @@ elabData info syn doc argDocs fc opts (PDatadecl n t_in dcons)
283283
284284 -- create an eliminator
285285 when (DefaultEliminator `elem` opts) $
286− evalStateT (elabEliminator params n t dcons info) Map.empty
286+ evalStateT (elabCaseFun True params n t dcons info) Map.empty
287+ -- create a case function
288+ when (DefaultCaseFun `elem` opts) $
289+ evalStateT (elabCaseFun False params n t dcons info) Map.empty
287290 where
288291 setDetaggable :: Name -> Idris ()
289292 setDetaggable n = do
@@ -369,11 +372,13 @@ elabData info syn doc argDocs fc opts (PDatadecl n t_in dcons)
369372type EliminatorState = StateT (Map.Map String Int) Idris
370373
371374-- TODO: Rewrite everything to use idris_implicits instead of manual splitting (or in TT)
372−elabEliminator :: [Int] -> Name -> PTerm ->
375+-- FIXME: Many things have name starting with elim internally since this was the only purpose in the first edition of the function
376+-- rename to caseFun to match updated intend
377+elabCaseFun :: Bool -> [Int] -> Name -> PTerm ->
373378 [(Docstring, [(Name, Docstring)], Name, PTerm, FC, [Name])] ->
374379 ElabInfo -> EliminatorState ()
375−elabEliminator paramPos n ty cons info = do
376− elimLog $ "Elaborating eliminator"
380+elabCaseFun ind paramPos n ty cons info = do
381+ elimLog $ "Elaborating case function"
377382 put (Map.fromList $ zip (concatMap (\(_, p, _, ty, _, _) -> (map show $ boundNamesIn ty) ++ map (show . fst) p) cons ++ (map show $ boundNamesIn ty)) (repeat 0))
378383 let (cnstrs, _) = splitPi ty
379384 let (splittedTy@(pms, idxs)) = splitPms cnstrs
@@ -381,7 +386,8 @@ elabEliminator paramPos n ty cons info = do
381386 motiveIdxs <- namePis False idxs
382387 let motive = mkMotive n paramPos generalParams motiveIdxs
383388 consTerms <- mapM (\(c@(_, _, cnm, _, _, _)) -> do
384− name <- freshName $ "elim_" ++ simpleName cnm
389+ let casefunt = if ind then "elim_" else "case_"
390+ name <- freshName $ casefunt ++ simpleName cnm
385391 consTerm <- extractConsTerm c generalParams
386392 return (name, expl, consTerm)) cons
387393 scrutineeIdxs <- namePis False idxs
@@ -392,11 +398,11 @@ elabEliminator paramPos n ty cons info = do
392398 let clauseConsElimArgs = map getPiName consTerms
393399 let clauseGeneralArgs' = map getPiName generalParams ++ [motiveName] ++ clauseConsElimArgs
394400 let clauseGeneralArgs = map (\arg -> pexp (PRef elimFC arg)) clauseGeneralArgs'
395− let elimSig = "-- eliminator signature: " ++ showTmImpls eliminatorTy
401+ let elimSig = "-- case function signature: " ++ showTmImpls eliminatorTy
396402 elimLog elimSig
397403 eliminatorClauses <- mapM (\(cns, cnsElim) -> generateEliminatorClauses cns cnsElim clauseGeneralArgs generalParams) (zip cons clauseConsElimArgs)
398404 let eliminatorDef = PClauses emptyFC [TotalFn] elimDeclName eliminatorClauses
399− elimLog $ "-- eliminator definition: " ++ (show . showDeclImp verbosePPOption) eliminatorDef
405+ elimLog $ "-- case function definition: " ++ (show . showDeclImp verbosePPOption) eliminatorDef
400406 State.lift $ idrisCatch (elabDecl EAll info eliminatorTyDecl) (\err -> return ())
401407 -- Do not elaborate clauses if there aren't any
402408 case eliminatorClauses of
@@ -406,10 +412,10 @@ elabEliminator paramPos n ty cons info = do
406412 elimLog s = State.lift (logLvl 2 s)
407413
408414 elimFC :: FC
409− elimFC = fileFC "(eliminator)"
415+ elimFC = fileFC "(casefun)"
410416
411417 elimDeclName :: Name
412− elimDeclName = SN $ ElimN n
418+ elimDeclName = if ind then SN . ElimN $ n else SN . CaseN $ n
413419
414420 applyNS :: Name -> [String] -> Name
415421 applyNS n [] = n
@@ -560,7 +566,7 @@ elabEliminator paramPos n ty cons info = do
560566 implidxs <- implicitIndexes (doc, cnm, ty, fc, fs)
561567 consArgs <- namePis False args
562568 let recArgs = findRecArgs consArgs
563− let recMotives = map applyRecMotive recArgs
569+ let recMotives = if ind then map applyRecMotive recArgs else []
564570 let (_, consIdxs) = splitArgPms resTy
565571 return $ piConstr (implidxs ++ consArgs ++ recMotives) (applyMotive consIdxs (applyCons cnm consArgs))
566572 where applyRecMotive :: (Name, Plicity, PTerm) -> (Name, Plicity, PTerm)
@@ -600,7 +606,7 @@ elabEliminator paramPos n ty cons info = do
600606 consArgs <- namePis False args
601607 let lhsPattern = PApp elimFC (PRef elimFC elimDeclName) (generalArgs ++ generalIdxs ++ [pexp $ applyCons cnm consArgs])
602608 let recArgs = findRecArgs consArgs
603− let recElims = map applyRecElim recArgs
609+ let recElims = if ind then map applyRecElim recArgs else []
604610 let rhsExpr = PApp elimFC (PRef elimFC cnsElim) (map convertArg implidxs ++ map convertArg consArgs ++ recElims)
605611 return $ PClause elimFC elimDeclName lhsPattern [] rhsExpr []
606612 where applyRecElim :: (Name, Plicity, PTerm) -> PArg