I agree with adding more such API’s. Look at this gist <https://gist.github.com/hooman/e77cc0e955a1db672ae49e45b0038d04> for an implementation of a few more of what I find useful. You can add them to your proposal if you like them and I will be able to help better shape it up. Here is a summary:
public func offset(of index: Index) -> IndexDistance public func index(atOffset offset: IndexDistance) -> Index public func index(of element: Iterator.Element, from firstIndex: Index) -> Index? public func index(from firstIndex: Index, where predicate: @noescape (Iterator.Element) throws -> Bool) rethrows -> Index? public func index<C: Collection where ...>(of elementSequence: C) -> Index? public func index<C: Collection where ...>(of elementSequence: C, from firstIndex: Index) -> Index? Look at the comments for the example usage. For `offset` function, see the source code for usage. Hooman > On May 10, 2016, at 11:54 AM, Nate Cook via swift-evolution > <[email protected]> wrote: > > I've needed these in the past and used them in other languages—any feedback > on this idea? > > Add last(where:) and lastIndex(where:) Methods to Bidirectional Collections > The standard library should include methods for finding the last element of a > bidirectional collection that matches a predicate, along with the index of > that element. > > Motivation > The standard library currently has (or will soon have) methods that perform a > linear search from the beginning of a collection to find an element that > matches a predicate: > > let a = [20, 30, 10, 40, 20, 30, 10, 40, 20] > a.first(where: { $0 > 25 }) // 30 > a.index(of: 10) // 2 > a.index(where: { $0 > 25 }) // 1 > Unfortunately, there is no such method that searches from the end of a > bidirectional collection. Finding the last of particular kind of element has > multiple applications, particularly with text, such as wrapping a long string > into lines of a maximum length or trimming whitespace from the beginning and > end of a string. > > This limitation can be worked around by using the methods above on the > reversed collection, but the resulting code is truly dreadful. For example, > to find the corresponding last index to a.index(where: { $0 > 25 }), this > unholy incantation is required: > > (a.reversed().index(where: { $0 > 25 })?.base).flatMap({ a.index(before: $0) > }) > Wat. > > Proposed solution > Bidirectional collections should include three new methods for symmetry with > the existing forward-searching APIs: last(where:), lastIndex(where:), and > lastIndex(of:), specifically for collections of Equatable elements. > > These additions would remove the need for searching in a reversed collection > and allow code like the following: > > a.last(where: { $0 > 25 }) // 40 > a.lastIndex(of: 10) // 6 > a.lastIndex(where: { $0 > 25 }) // 7 > Much better! > > _______________________________________________ > swift-evolution mailing list > [email protected] > https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
