Thanks Hooman! Those do look like useful extensions. I think the proposal 
should stay focused on the APIs it includes already.

> On May 10, 2016, at 4:18 PM, Hooman Mehr <[email protected]> wrote:
> 
> 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

I like these, but I doubt they would get much traction, since they're 
essentially substituting startIndex into existing methods. I have thought it 
would be nice to have startIndex as the default parameter to those methods, 
though, so you could write either of these:

        let i = c.index(c.startIndex, offsetBy: 5)              // current
        let i = c.index(offsetBy: 5)                            // nice addition

> 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?

I have the same reaction to these. Because indices are shared between 
collections and slices, instead of using a starting index, Swift's collection 
operations can just work on a slice. So instead of calling

        let i = c.index(of: "A", from: firstIndex)

you can call

        let i = c.suffix(from: firstIndex).index(of: "A")

> public func index<C: Collection where ...>(of elementSequence: C) -> Index?
> public func index<C: Collection where ...>(of elementSequence: C, from 
> firstIndex: Index) -> Index?

These methods we don't have at all currently, and could really use! I would 
definitely support a proposal for finding a subsequence of a collection. There 
are several algorithms beyond the naive approach, so it would be interesting to 
see if / how a proposal could use those in a generic context.

Thanks again!
Nate

> 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] <mailto:[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] <mailto:[email protected]>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to