Partition: Make mutating functions return `@discardableResult`
Using the mutating partitioning functions are useful even when the returned index isn’t used.
The Embracing Algorithms (WWDC 2018) session implements a bringForward(elementsSatisfying:) function on MutableCollection.1 It uses stablePartition(by:) in its implementation, but doesn’t need its return value, resulting in a warning.
Actual behavior
extension MutableCollection {
mutating func bringForward(elementsSatisfying predicate: (Element) -> Bool) {
if let predecessor = indexBeforeFirst(where: predicate) {
self[predecessor...].stablePartition(by: { !predicate($0) }) // ⚠️ Result of call to 'stablePartition(by:)' is unused
}
}
}
Expected behavior
extension MutableCollection {
mutating func bringForward(elementsSatisfying predicate: (Element) -> Bool) {
if let predecessor = indexBeforeFirst(where: predicate) {
self[predecessor...].stablePartition(by: { !predicate($0) })
}
}
}
While it could be argued that bringForward(elementsSatisfying:) should return an Index as well, even that return value isn’t always needed to be used and should be marked as @discardableResult.
Checklist
- [x] If possible, I've reproduced the issue using the
mainbranch of this package - [x] I've searched for existing GitHub issues
- This implementation function can be seen on page 218 of the presentation slides PDF.
It's a good question.
I can't recall, but I imagine we just followed the precedent set by partition(by:) from the standard library which does not mark its result as a @discardableResult.
While it could be argued that
bringForward(elementsSatisfying:)should return anIndexas well, even that return value isn’t always needed to be used and should be marked as@discardableResult.
I do think bringForward(elementsSatisfying:) should probably return an Index (one of Alexander Stepanov's API design principles is "don't throw away useful information"), but I agree that should arguably be marked as @discardableResult.
@discardableResult #67
The standard library can also be changed. If not now, then in Swift 6.