@@ -283,7 +283,10 @@ elabData info syn doc argDocs fc opts (PDatadecl n t_in dcons)
284 -- create an eliminator
284 -- create an eliminator
285 when (DefaultEliminator `elem` opts) $
285 when (DefaultEliminator `elem` opts) $
286+ evalStateT (elabCaseFun True params n t dcons info) Map.empty
287+ -- create a case function
288+ when (DefaultCaseFun `elem` opts) $
286− evalStateT (elabEliminator params n t dcons info) Map.empty
289+ evalStateT (elabCaseFun False params n t dcons info) Map.empty
288 setDetaggable :: Name -> Idris ()
291 setDetaggable :: Name -> Idris ()
289 setDetaggable n = do
292 setDetaggable n = do
@@ -369,11 +372,13 @@ elabData info syn doc argDocs fc opts (PDatadecl n t_in dcons)
369type EliminatorState = StateT (Map.Map String Int) Idris
372type EliminatorState = StateT (Map.Map String Int) Idris
371-- TODO: Rewrite everything to use idris_implicits instead of manual splitting (or in TT)
374-- TODO: Rewrite everything to use idris_implicits instead of manual splitting (or in TT)
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
372−elabEliminator :: [Int] -> Name -> PTerm ->
377+elabCaseFun :: Bool -> [Int] -> Name -> PTerm ->
373 [(Docstring, [(Name, Docstring)], Name, PTerm, FC, [Name])] ->
378 [(Docstring, [(Name, Docstring)], Name, PTerm, FC, [Name])] ->
374 ElabInfo -> EliminatorState ()
379 ElabInfo -> EliminatorState ()
375−elabEliminator paramPos n ty cons info = do
380+elabCaseFun ind paramPos n ty cons info = do
376− elimLog $ "Elaborating eliminator"
381+ elimLog $ "Elaborating case function"
377 put (Map.fromList $ zip (concatMap (\(_, p, _, ty, _, _) -> (map show $ boundNamesIn ty) ++ map (show . fst) p) cons ++ (map show $ boundNamesIn ty)) (repeat 0))
382 put (Map.fromList $ zip (concatMap (\(_, p, _, ty, _, _) -> (map show $ boundNamesIn ty) ++ map (show . fst) p) cons ++ (map show $ boundNamesIn ty)) (repeat 0))
378 let (cnstrs, _) = splitPi ty
383 let (cnstrs, _) = splitPi ty
379 let (splittedTy@(pms, idxs)) = splitPms cnstrs
384 let (splittedTy@(pms, idxs)) = splitPms cnstrs
@@ -381,7 +386,8 @@ elabEliminator paramPos n ty cons info = do
381 motiveIdxs <- namePis False idxs
386 motiveIdxs <- namePis False idxs
382 let motive = mkMotive n paramPos generalParams motiveIdxs
387 let motive = mkMotive n paramPos generalParams motiveIdxs
383 consTerms <- mapM (\(c@(_, _, cnm, _, _, _)) -> do
388 consTerms <- mapM (\(c@(_, _, cnm, _, _, _)) -> do
389+ let casefunt = if ind then "elim_" else "case_"
384− name <- freshName $ "elim_" ++ simpleName cnm
390+ name <- freshName $ casefunt ++ simpleName cnm
385 consTerm <- extractConsTerm c generalParams
391 consTerm <- extractConsTerm c generalParams
386 return (name, expl, consTerm)) cons
392 return (name, expl, consTerm)) cons
387 scrutineeIdxs <- namePis False idxs
393 scrutineeIdxs <- namePis False idxs
@@ -392,11 +398,11 @@ elabEliminator paramPos n ty cons info = do
392 let clauseConsElimArgs = map getPiName consTerms
398 let clauseConsElimArgs = map getPiName consTerms
393 let clauseGeneralArgs' = map getPiName generalParams ++ [motiveName] ++ clauseConsElimArgs
399 let clauseGeneralArgs' = map getPiName generalParams ++ [motiveName] ++ clauseConsElimArgs
394 let clauseGeneralArgs = map (\arg -> pexp (PRef elimFC arg)) clauseGeneralArgs'
400 let clauseGeneralArgs = map (\arg -> pexp (PRef elimFC arg)) clauseGeneralArgs'
395− let elimSig = "-- eliminator signature: " ++ showTmImpls eliminatorTy
401+ let elimSig = "-- case function signature: " ++ showTmImpls eliminatorTy
396 elimLog elimSig
402 elimLog elimSig
397 eliminatorClauses <- mapM (\(cns, cnsElim) -> generateEliminatorClauses cns cnsElim clauseGeneralArgs generalParams) (zip cons clauseConsElimArgs)
403 eliminatorClauses <- mapM (\(cns, cnsElim) -> generateEliminatorClauses cns cnsElim clauseGeneralArgs generalParams) (zip cons clauseConsElimArgs)
398 let eliminatorDef = PClauses emptyFC [TotalFn] elimDeclName eliminatorClauses
404 let eliminatorDef = PClauses emptyFC [TotalFn] elimDeclName eliminatorClauses
399− elimLog $ "-- eliminator definition: " ++ (show . showDeclImp verbosePPOption) eliminatorDef
405+ elimLog $ "-- case function definition: " ++ (show . showDeclImp verbosePPOption) eliminatorDef
400 State.lift $ idrisCatch (elabDecl EAll info eliminatorTyDecl) (\err -> return ())
406 State.lift $ idrisCatch (elabDecl EAll info eliminatorTyDecl) (\err -> return ())
401 -- Do not elaborate clauses if there aren't any
407 -- Do not elaborate clauses if there aren't any
402 case eliminatorClauses of
408 case eliminatorClauses of
@@ -406,10 +412,10 @@ elabEliminator paramPos n ty cons info = do
406 elimLog s = State.lift (logLvl 2 s)
412 elimLog s = State.lift (logLvl 2 s)
408 elimFC :: FC
414 elimFC :: FC
409− elimFC = fileFC "(eliminator)"
415+ elimFC = fileFC "(casefun)"
411 elimDeclName :: Name
417 elimDeclName :: Name
412− elimDeclName = SN $ ElimN n
418+ elimDeclName = if ind then SN . ElimN $ n else SN . CaseN $ n
414 applyNS :: Name -> [String] -> Name
420 applyNS :: Name -> [String] -> Name
415 applyNS n [] = n
421 applyNS n [] = n
@@ -560,7 +566,7 @@ elabEliminator paramPos n ty cons info = do
560 implidxs <- implicitIndexes (doc, cnm, ty, fc, fs)
566 implidxs <- implicitIndexes (doc, cnm, ty, fc, fs)
561 consArgs <- namePis False args
567 consArgs <- namePis False args
562 let recArgs = findRecArgs consArgs
568 let recArgs = findRecArgs consArgs
563− let recMotives = map applyRecMotive recArgs
569+ let recMotives = if ind then map applyRecMotive recArgs else []
564 let (_, consIdxs) = splitArgPms resTy
570 let (_, consIdxs) = splitArgPms resTy
565 return $ piConstr (implidxs ++ consArgs ++ recMotives) (applyMotive consIdxs (applyCons cnm consArgs))
571 return $ piConstr (implidxs ++ consArgs ++ recMotives) (applyMotive consIdxs (applyCons cnm consArgs))
566 where applyRecMotive :: (Name, Plicity, PTerm) -> (Name, Plicity, PTerm)
572 where applyRecMotive :: (Name, Plicity, PTerm) -> (Name, Plicity, PTerm)
@@ -600,7 +606,7 @@ elabEliminator paramPos n ty cons info = do
600 consArgs <- namePis False args
606 consArgs <- namePis False args
601 let lhsPattern = PApp elimFC (PRef elimFC elimDeclName) (generalArgs ++ generalIdxs ++ [pexp $ applyCons cnm consArgs])
607 let lhsPattern = PApp elimFC (PRef elimFC elimDeclName) (generalArgs ++ generalIdxs ++ [pexp $ applyCons cnm consArgs])
602 let recArgs = findRecArgs consArgs
608 let recArgs = findRecArgs consArgs
603− let recElims = map applyRecElim recArgs
609+ let recElims = if ind then map applyRecElim recArgs else []
604 let rhsExpr = PApp elimFC (PRef elimFC cnsElim) (map convertArg implidxs ++ map convertArg consArgs ++ recElims)
610 let rhsExpr = PApp elimFC (PRef elimFC cnsElim) (map convertArg implidxs ++ map convertArg consArgs ++ recElims)
605 return $ PClause elimFC elimDeclName lhsPattern [] rhsExpr []
611 return $ PClause elimFC elimDeclName lhsPattern [] rhsExpr []
606 where applyRecElim :: (Name, Plicity, PTerm) -> PArg
612 where applyRecElim :: (Name, Plicity, PTerm) -> PArg