This PR generates `.ctorIdx` functions for all inductive types, not just enumeration types. This can be a building block for other constructions (`BEq`, `noConfusion`) that are size-efficient even for large inductives. It also renames it from `.toCtorIdx` to `.ctorIdx`, which is the more idiomatic naming. The old name exists as an alias, with a deprecation attribute to be added after the next stage0 update. These functions can arguably compiled down to a rather efficient tag lookup, rather than a `case` statement. This is future work (but hopefully near future). For a fair number of basic types the compiler is not able to compile a function using `casesOn` until further definitions have been defined. This therefore (ab)uses the `genInjectivity` flag and `gen_injective_theorems%` command to also control the generation of this construct. For (slightly) more efficient kernel reduction one could use `.rec` rather than `.casesOn`. I did not do that yet, also because it complicates compilation.
26 lines
585 B
Text
26 lines
585 B
Text
/-
|
|
The derive handlers should manage both inductives and not ignore the second one,
|
|
Fixes `#3057`
|
|
-/
|
|
|
|
mutual
|
|
inductive Tree : Type where
|
|
| node : ListTree → Tree
|
|
deriving Repr, DecidableEq, BEq, Hashable, Ord
|
|
|
|
inductive ListTree : Type where
|
|
| nil : ListTree
|
|
| cons : Tree → ListTree → ListTree
|
|
deriving Repr, DecidableEq, BEq, Hashable, Ord
|
|
end
|
|
|
|
#synth Repr Tree
|
|
#synth Repr ListTree
|
|
#synth DecidableEq Tree
|
|
#synth DecidableEq ListTree
|
|
#synth BEq Tree
|
|
#synth BEq ListTree
|
|
#synth Hashable Tree
|
|
#synth Hashable ListTree
|
|
#synth Ord Tree
|
|
#synth Ord ListTree
|