So like most good pitches, this one comes about because of a bug I recently
fixed which seems common and subtle enough that I think it would be nice to
include in the standard library.
Removing a collection of elements at once from a collection. You might want to
do this in some kind of advanced filtering code. In my case, our code was
merging adjacent elements in-place, and storing a list of indexes that were no
longer required because they were now part of a merged element, and then we
cleaned up the duplicates by removing those indexes.
A näive implementation might look like this:
for index in indexesToRemove {
myArray.remove(at: index)
}
However, as the array is mutated, those indexes won’t make sense any more.
You’ll end up with invalid results - for example, if you have the array [0,1,2]
and indexesToRemove is [0,1], your resulting array will actually be [1] (not
[2], as expected). Actually removing a batch of indexes is subtly more complex.
Here’s my generic implementation:
extension RangeReplaceableCollection where Index:Hashable,
Self:BidirectionalIndexable {
mutating func remove(at indexes: Set<Index>) {
var removed : IndexDistance = 0
for idx in indexes.sorted() {
remove(at: index(idx, offsetBy: -removed))
removed = removed.advanced(by: 1)
}
}
}
I think it would be nice to have this in the standard library. I think it’s a
reasonably common problem and it’d be nice to make it easier for people.
Karl
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution