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.
17 lines
753 B
Text
17 lines
753 B
Text
import Lean.Data.Json
|
||
open Lean
|
||
|
||
instance [BEq α] [BEq β] : BEq (Except α β) where
|
||
beq | .ok a, .ok b => BEq.beq a b
|
||
| .error a, .error b => BEq.beq a b
|
||
| _, _ => false
|
||
|
||
example : Json.parse "\"\\u7406\\u79d1\"" == .ok "理科" := by native_decide
|
||
example : Json.parse "\"\\u7406\\u79D1\"" == .ok "理科" := by native_decide
|
||
|
||
example : Json.pretty "\x0b" == "\"\\u000b\"" := by native_decide
|
||
example : Json.pretty "\x1b" == "\"\\u001b\"" := by native_decide
|
||
example : Json.parse "\"\\u000b\"" == .ok "\x0b" := by native_decide
|
||
example : Json.parse "\"\\u001b\"" == .ok "\x1b" := by native_decide
|
||
example : Json.parse "\"\\u000B\"" == .ok "\x0b" := by native_decide
|
||
example : Json.parse "\"\\u001B\"" == .ok "\x1b" := by native_decide
|