feat: add ForIn instance for PHashSet (#7214)

This PR adds a `ForIn` instance for the `PersistentHashSet` type.
This commit is contained in:
Leonardo de Moura 2025-02-24 12:37:45 -08:00 committed by GitHub
parent 77e0fa4efe
commit 5cbeb22564
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 42 additions and 0 deletions

View file

@ -53,4 +53,11 @@ variable {_ : BEq α} {_ : Hashable α}
def toList (s : PersistentHashSet α) : List α :=
s.set.toList.map (·.1)
protected def forIn {_ : BEq α} {_ : Hashable α} [Monad m]
(s : PersistentHashSet α) (init : σ) (f : ασ → m (ForInStep σ)) : m σ := do
PersistentHashMap.forIn s.set init fun p s => f p.1 s
instance {_ : BEq α} {_ : Hashable α} : ForIn m (PersistentHashSet α) α where
forIn := PersistentHashSet.forIn
end PersistentHashSet

View file

@ -0,0 +1,35 @@
import Lean.Data.PersistentHashSet
open Lean
def sum (s : PHashSet Nat) : Nat := Id.run do
let mut r := 0
for a in s do
r := r + a
return r
def sumIf (s : PHashSet Nat) (p : Nat → Bool) : Nat := Id.run do
let mut r := 0
for a in s do
unless p a do
continue
r := r + a
return r
def mk [Hashable α] [BEq α] (f : Nat → α) (n : Nat) : PHashSet α := Id.run do
let mut s := {}
for i in [:n] do
s := s.insert (f i)
return s
/-- info: 45 -/
#guard_msgs in
#eval sum (mk id 10)
/-- info: 9900 -/
#guard_msgs in
#eval sum (mk (2*·) 100)
/-- info: 2450 -/
#guard_msgs in
#eval sumIf (mk id 100) (· % 2 == 0)