[swift-evolution] Proposal: Add scan, takeWhile, dropWhile, and iterate to the stdlib

David Smith david_smith at apple.com
Wed Jan 13 20:40:38 CST 2016


Naming conventions would suggest that something returning a new collection should be named with a noun phrase describing what it returns. Unfortunately, most of the ones I can think of off the top of my head are fairly clunky. "suffixFromFirstNonMatchingElement" describes what it does, but I haven't thought of a non-painful way to say that yet. "suffixExcluding" is almost right, but it incorrectly implies (to my eye at least) that the returned collection excludes all elements matching the predicate, rather than just matching prefixes. Hm, what about flipping the predicate and getting a "suffixFrom" overload that takes a predicate for the first matching element to be included, rather than the last matching element to be excluded?

	David

> On Jan 13, 2016, at 5:54 PM, Dany St-Amant via swift-evolution <swift-evolution at swift.org> wrote:
> 
> The dropWhile sounds weird to me, I usually would see such functionality as a dropUntil; I discard stuff until I see what I want.
> Your example below doesn’t use dropWhile, but skipWhile; which sounds a bit better that dropWhile as one skip what he doesn’t want.
> 
> What do the other languages use? A dropWhile, skipWhile or dropUntil concept?
> 
> Dany
> 
> 
>> Le 11 janv. 2016 à 01:20, Kevin Ballard via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> a écrit :
>> 
>> Here's a few toy examples, if it helps:
>> 
>> // list of all powers of 2 below some limit
>> iterate(1, apply: { $0 * 2 }).takeWhile({ $0 < limit })
>> 
>> // first "word" of a string, skipping whitespace
>> let cs = NSCharacterSet.whitespaceCharacterSet()
>> String(str.unicodeScalars.skipWhile({ cs.longCharacterIsMember($0.value) })
>>                          .takeWhile({ !cs.longCharacterIsMember($0.value) }))
>> 
>> // running total of an array of numbers
>> numbers.scan(0, combine: +).dropFirst()
>> 
>> // infinite fibonacci sequence
>> iterate((0,1), apply: { ($1, $0+$1) }).lazy.map({$1})
>> 
>> -Kevin Ballard
>> 
>>> On Mon, Dec 28, 2015, at 03:59 PM, Kevin Ballard wrote:
>>> >
>>> > ## Detailed design
>>> >
>>> > We add the following extension to SequenceType:
>>> >
>>> > extension SequenceType {
>>> >     func scan<T>(initial: T, @noescape combine: (T, Self.Generator.Element) throws -> T) rethrows -> [T]
>>> >     func dropWhile(@noescape dropElement: (Self.Generator.Element) throws -> Bool) rethrows -> [Self.Generator.Element]
>>> >     func takeWhile(@noescape takeElement: (Self.Generator.Element) throws -> Bool) rethrows -> [Self.Generator.Element]
>>> > }
>>> >
> 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160113/4d1c21de/attachment.html>


More information about the swift-evolution mailing list