Skip to content

Commit e548fa4

Browse files
authored
fix: Char -> Bool as default instance for string search (#11503)
This PR marks `Char -> Bool` patterns as default instances for string search. This means that things like `" ".find (·.isWhitespace)` can now be elaborated without error. Previously, it was necessary to write `" ".find Char.isWhitespace`. Thank you to David Christiansen for the idea of using a default instance.
1 parent b94cf2c commit e548fa4

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

src/Init/Data/String/Pattern/Pred.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,11 @@ instance : Std.Iterators.Finite (ForwardCharPredSearcher p s) Id :=
7979
instance : Std.Iterators.IteratorLoop (ForwardCharPredSearcher p s) Id Id :=
8080
.defaultImplementation
8181

82+
@[default_instance]
8283
instance {p : Char → Bool} : ToForwardSearcher p (ForwardCharPredSearcher p) where
8384
toSearcher := iter p
8485

86+
@[default_instance]
8587
instance {p : Char → Bool} : ForwardPattern p := .defaultImplementation
8688

8789
instance {p : Char → Prop} [DecidablePred p] : ToForwardSearcher p (ForwardCharPredSearcher p) where
@@ -153,9 +155,11 @@ instance : Std.Iterators.Finite (BackwardCharPredSearcher s) Id :=
153155
instance : Std.Iterators.IteratorLoop (BackwardCharPredSearcher s) Id Id :=
154156
.defaultImplementation
155157

158+
@[default_instance]
156159
instance {p : Char → Bool} : ToBackwardSearcher p BackwardCharPredSearcher where
157160
toSearcher := iter p
158161

162+
@[default_instance]
159163
instance {p : Char → Bool} : BackwardPattern p := ToBackwardSearcher.defaultImplementation
160164

161165
instance {p : Char → Prop} [DecidablePred p] : ToBackwardSearcher p BackwardCharPredSearcher where

src/Lean/Data/Xml/Parser.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ def SystemLiteral : Parser String :=
154154
/-- https://www.w3.org/TR/xml/#NT-PubidChar -/
155155
def PubidChar : Parser LeanChar :=
156156
asciiLetter <|> digit <|> endl <|> attempt do
157-
let c ← any
157+
let c : _root_.Char := ← any
158158
if "-'()+,./:=?;!*#@$_%".contains c then pure c else fail "PublidChar expected"
159159

160160
/-- https://www.w3.org/TR/xml/#NT-PubidLiteral -/

tests/lean/run/string_slice.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,3 +240,12 @@ end
240240

241241
#guard ("".toSlice.split "").toList == ["".toSlice, "".toSlice]
242242
#guard ("abc".toSlice.split "").toList == ["".toSlice, "a".toSlice, "b".toSlice, "c".toSlice, "".toSlice]
243+
244+
#guard " ".find (·.isWhitespace) = " ".startPos
245+
#guard " ".find (· = ' ') = " ".startPos
246+
#guard " ".startsWith (·.isWhitespace) = true
247+
#guard " ".startsWith (· = ' ') = true
248+
#guard " ".revFind? (·.isWhitespace) = some " ".startPos
249+
#guard " ".revFind? (· = ' ') = some " ".startPos
250+
#guard " ".endsWith (·.isWhitespace) = true
251+
#guard " ".endsWith (· = ' ') = true

0 commit comments

Comments
 (0)