This PR adds an alternative implementation of `Deriving Ord` based on comparing `.ctorIdx` and using a dedicated matcher for comparing same constructors (added in #10152). The new option `deriving.ord.linear_construction_threshold` sets the constructor count threshold (10 by default) for using the new construction. It also (unconditionally) changes the implementation for enumeration types to simply compare the `ctorIdx`.
49 lines
1 KiB
Text
49 lines
1 KiB
Text
|
||
inductive SimpleInd
|
||
| A
|
||
| B
|
||
deriving Ord
|
||
|
||
mutual
|
||
inductive Foo
|
||
| A : Int → (3 = 3) → String → Foo
|
||
| B : Bar → Foo
|
||
deriving Ord
|
||
inductive Bar
|
||
| C
|
||
| D : Foo → Bar
|
||
deriving Ord
|
||
end
|
||
|
||
inductive ManyConstructors | A | B | C | D | E | F | G | H | I | J | K | L
|
||
| M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
|
||
deriving Ord
|
||
|
||
structure Person where
|
||
firstName : String
|
||
lastName : String
|
||
age : Nat
|
||
deriving Ord
|
||
|
||
example : compare { firstName := "A", lastName := "B", age := 10 : Person } ⟨"B", "A", 9⟩ = Ordering.lt := rfl
|
||
|
||
structure Company where
|
||
name : String
|
||
ceo : Person
|
||
numberOfEmployees : Nat
|
||
deriving Ord
|
||
|
||
structure Fixed (α : Type u) where
|
||
val : Int
|
||
deriving Ord
|
||
|
||
inductive Fixed' : Type → Type 1 where
|
||
| mk : Int → Fixed' α
|
||
deriving Ord
|
||
|
||
-- Before fixing the definition of `Ordering.then`, this would panic,
|
||
-- because short-circuiting was not working.
|
||
def foo (a : List Nat) := Ordering.then (compare a.length 1) (compare a[0]! 1)
|
||
/-- info: Ordering.lt -/
|
||
#guard_msgs in
|
||
#eval foo []
|