Description
Hi @deckarep, I want to contribute the PR for supporting 1.23 iterator. I don't know if you are interested.
Background
The Iterator implemented in this package returns a channel to support range syntax. Therefore, it requires calling Stop
to close the underlying channel. With the 1.23 iterator, we can use the for-range syntax without needing to call Stop
. See the prototype implementation in issue #140.
My original thought was to use for-range on the Each method as follows. However, the logic is reversed. In the Each(func(t) bool)
method of the set interface, if the passed function returns true, the iteration stops. According to the 1.23 SPEC, if the loop body for the range function terminates, the yield function will return false.
// not work as expect
mySet := mapset.NewSet[int]()
for v := range mySet.Each {
...
}
Proposal
Let's allow users to use the for-range loop to iterate through the set without additional operation (such as Stop
) after version 1.23.
mySet := mapset.NewSet[int]()
for v := range Values(mySet) {
...
}
#140 is one of implementation to achieve that.
The pros of this PR: use func(func(element T) bool
as iterator instead of 1.23 iter.Seq. So the go.mod no need to upgrade to 1.23. The user use 1.23 compiler can user for-loop. The user before 1.23 can use old function way.
The cons of using func(func(element T) bool)
instead of iter.Seq
is reduced readability.
The naming of Values follows the conventions used in the slices package slices.Values and the maps package maps.Values.