<html><body><div>Wouldn't `droppingFirst()` and `droppingWhile()` satisfy the naming conventions?<br></div><div>The downside is that these are a bit long.<br data-mce-bogus="1"></div><div>My hesitation with "skip" is that I'm used to "skip" in the context of streams, not collections, i.e. where I'm forwarding a read position (or cursor) while ignoring the elements passed and not returning the rest.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>-Thorsten<br data-mce-bogus="1"></div><div><br>Am 22. Januar 2016 um 08:56 schrieb Kevin Ballard via swift-evolution <swift-evolution@swift.org>:<br><br><div><blockquote type="cite"><div class="msg-quote" style="word-wrap: break-word;" data-mce-style="word-wrap: break-word;"><div class="">I’m tempted to say we should rename dropFirst() / dropWhile() to skipFirst() / skipWhile(), i.e. use Rust’s name, because “skip” doesn’t sound like a mutating verb but I do see why people say “drop” does. But yeah, that would be a different proposal entirely.</div><div class=""><br class=""></div><div class="">-Kevin Ballard</div><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 21, 2016, at 5:02 PM, Andrew Bennett <<a href="mailto:cacoyi@gmail.com" class="" data-mce-href="mailto:cacoyi@gmail.com">cacoyi@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Great point Kevin, you've convinced me. I'm also happy with `dropWhile` for this reason. My issues with "drop" should be resolved in a separate proposal.</div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Fri, Jan 22, 2016 at 11:17 AM, Kevin Ballard via swift-evolution <span dir="ltr" class=""><<a href="mailto:swift-evolution@swift.org" class="" data-mce-href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin: 0 0 0 0.8ex; border-left: 1px #ccc solid; padding-left: 1ex;" data-mce-style="margin: 0 0 0 0.8ex; border-left: 1px #ccc solid; padding-left: 1ex;"><u class=""></u><div class=""><div class="">I'm rather opposed to the idea of taking the methods that take indexes and overloading them to take predicates instead. They're extremely different functionality. An index is a value that, once generated, is constant-time to use, and therefore the functions that take them are typically O(1). For example, CollectionType.suffixFrom() is documented explicitly as being O(1).<br class=""></div><div class=""> </div><div class="">But functions taking a predicate must be O(N), because they have to evaluate the predicate on every element in turn until it returns true (or false, depending on the method in question).<br class=""></div><div class=""> </div><div class="">So if we overload suffixFrom() to take a predicate, then we have one function with one overload that's always O(1), and one overload that's always O(N), and that is a great way to confuse people and hide performance issues.<br class=""></div><div class=""> </div><div class="">This is also why I'm particularly fond of the takeWhile / dropWhile terminology. Besides the rather extensive precedent, the inclusion of the word "while" makes it clear that it's iterating over the sequence/collection, which means it's intuitively O(N).<span class="HOEnZb"><span style="color: #888888;" data-mce-style="color: #888888;" color="#888888"><br class=""></span></span></div><span class="HOEnZb"><span style="color: #888888;" data-mce-style="color: #888888;" color="#888888"><div class=""> </div><div class="">-Kevin Ballard</div></span></span><div class=""><div class="h5"><div class=""> </div><div class="">On Thu, Jan 21, 2016, at 02:57 PM, David Smith wrote:<br class=""></div><blockquote type="cite" class=""><div class="">To be honest these all seem equally "weird" looking to me, so my hope is that it's just a matter of familiarity 😊 My personal inclination is still that overloading suffixFrom with a predicate-taking variant is the way to go. That way it occupies the same mental slot as the existing suffixFrom method, and all you have to decide when using it is "do I want to specify where to suffix from, or how to find where to suffix from?". e.g. it basically becomes sugar that turns<br class=""></div><div class=""> </div><div class="">let idx = foo.indexOf { … }<br class=""></div><div class="">let suffix = foo.suffixFrom(idx)<br class=""></div><div class=""> </div><div class="">into<br class=""></div><div class=""> </div><div class="">let suffix = foo.suffixFrom { … }<br class=""></div><div class=""> </div><div class=""><div class="">with the bonus feature that it works on single-pass sequences.<br class=""></div><div class=""> </div><div class=""><div class=""><span style="white-space: pre-wrap;" class="" data-mce-style="white-space: pre-wrap;"></span>David<br class=""></div><div class=""><div class=""><div class=""> </div><div class=""><blockquote type="cite" class=""><div class="">On Jan 13, 2016, at 11:52 PM, Kevin Ballard via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="" data-mce-href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>> wrote:<br class=""></div><div class=""> </div><div class=""><div class=""><div class="">"suffixAfter" sounds like the equivalent of dropFirst(_:), i.e. it sounds like it should take a count of elements to skip. Similarly, actually trying an expression that takes a predicate looks weird:<br class=""></div><div class=""> </div><div class=""> seq.suffixAfter({ isspace($0) })<br class=""></div><div class=""> </div><div class="">Even knowing what it's supposed to do, it's hard for me to read that expression in any sensible fashion.<br class=""></div><div class=""> </div><div class="">Also, I'm not sure the "noun phrase" convention really makes sense for SequenceType methods. They're not technically mutating methods, but single-pass collections are in fact destructively mutated by Array-returning sequence methods (and the methods that return SubSequence also destructively mutate upon any access to the returned subsequence). Which is to say, despite not being marked as "mutating", they do in fact behave like mutating methods for single-pass sequences. Which suggests that verb phrases are perfectly fine.<br class=""></div><div class=""> </div><div class="">-Kevin Ballard<br class=""></div><div class=""> </div><div class="">On Wed, Jan 13, 2016, at 08:36 PM, David Smith via swift-evolution wrote:<br class=""></div><blockquote type="cite" class=""><div class=""> </div><div class="">Rob Rix pointed out that "suffixAfter" would meet all my original criteria. Not sure if keeping the original "match the stuff to drop rather than the stuff to keep" semantics are critical, but this gives us an option for either way 😊<br class=""></div><div class=""> </div><div class=""> David<br class=""></div><div class=""><div class=""> </div><div class="">On Jan 13, 2016, at 6:40 PM, David Smith via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="" data-mce-href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>> wrote:<br class=""></div></div><blockquote type="cite" class=""><div class=""><div class="">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?<br class=""></div><div class=""> </div><div class=""><span style="white-space: pre-wrap;" class="" data-mce-style="white-space: pre-wrap;"></span>David<br class=""></div><div class=""><div class=""> </div><div class=""><blockquote type="cite" class=""><div class="">On Jan 13, 2016, at 5:54 PM, Dany St-Amant via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="" data-mce-href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>> wrote:<br class=""></div><div class=""> </div><div class=""><div style="word-wrap: break-word;" class="" data-mce-style="word-wrap: break-word;"><div class="">The dropWhile sounds weird to me, I usually would see such functionality as a dropUntil; I discard stuff until I see what I want.<br class=""></div><div class="">Your example below doesn’t use dropWhile, but skipWhile; which sounds a bit better that dropWhile as one skip what he doesn’t want.<br class=""></div><div class=""> </div><div class="">What do the other languages use? A dropWhile, skipWhile or dropUntil concept?<br class=""></div><div class=""> </div><div class="">Dany<br class=""></div><div class=""> </div><div class=""> </div><div class=""><blockquote type="cite" class=""><div class="">Le 11 janv. 2016 à 01:20, Kevin Ballard via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="" data-mce-href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>> a écrit :<br class=""></div><div class=""><div style="word-wrap: break-word;" class="" data-mce-style="word-wrap: break-word;"><div class=""> </div><div class="">Here's a few toy examples, if it helps:<br class=""></div><div class=""> </div><div class=""><div style="font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008400; margin: 0px;" class="" data-mce-style="font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008400; margin: 0px;">// list of all powers of 2 below some limit<br class=""></div><div style="font-size: 11px; line-height: normal; font-family: 'menlo'; margin: 0px;" class="" data-mce-style="font-size: 11px; line-height: normal; font-family: 'menlo'; margin: 0px;">iterate(<span style="color: #272ad8;" class="" data-mce-style="color: #272ad8;">1</span>, apply: { $0 * <span style="color: #272ad8;" class="" data-mce-style="color: #272ad8;">2</span> }).takeWhile({ $0 < limit })<br class=""></div><div style="font-size: 11px; line-height: normal; font-family: 'menlo'; min-height: 13px; margin: 0px;" class="" data-mce-style="font-size: 11px; line-height: normal; font-family: 'menlo'; min-height: 13px; margin: 0px;"> </div><div style="font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008400; margin: 0px;" class="" data-mce-style="font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008400; margin: 0px;">// first "word" of a string, skipping whitespace<br class=""></div><div style="font-size: 11px; line-height: normal; font-family: 'menlo'; margin: 0px;" class="" data-mce-style="font-size: 11px; line-height: normal; font-family: 'menlo'; margin: 0px;"><span style="color: #bb2ca2;" class="" data-mce-style="color: #bb2ca2;">let</span> cs = NSCharacterSet.whitespaceCharacterSet()<br class=""></div><div style="font-size: 11px; line-height: normal; font-family: 'menlo'; margin: 0px;" class="" data-mce-style="font-size: 11px; line-height: normal; font-family: 'menlo'; margin: 0px;">String(str.unicodeScalars.skipWhile({ cs.longCharacterIsMember($0.value) })<br class=""></div><div style="font-size: 11px; line-height: normal; font-family: 'menlo'; margin: 0px;" class="" data-mce-style="font-size: 11px; line-height: normal; font-family: 'menlo'; margin: 0px;"> .takeWhile({ !cs.longCharacterIsMember($0.value) }))<br class=""></div><div style="font-size: 11px; line-height: normal; font-family: 'menlo'; min-height: 13px; margin: 0px;" class="" data-mce-style="font-size: 11px; line-height: normal; font-family: 'menlo'; min-height: 13px; margin: 0px;"> </div><div style="font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008400; margin: 0px;" class="" data-mce-style="font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008400; margin: 0px;">// running total of an array of numbers<br class=""></div><div style="font-size: 11px; line-height: normal; font-family: 'menlo'; margin: 0px;" class="" data-mce-style="font-size: 11px; line-height: normal; font-family: 'menlo'; margin: 0px;">numbers.scan(<span style="color: #272ad8;" class="" data-mce-style="color: #272ad8;">0</span>, combine: +).dropFirst()<br class=""></div><div style="font-size: 11px; line-height: normal; font-family: 'menlo'; min-height: 13px; margin: 0px;" class="" data-mce-style="font-size: 11px; line-height: normal; font-family: 'menlo'; min-height: 13px; margin: 0px;"> </div><div style="font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008400; margin: 0px;" class="" data-mce-style="font-size: 11px; line-height: normal; font-family: 'menlo'; color: #008400; margin: 0px;">// infinite fibonacci sequence<br class=""></div><div style="font-size: 11px; line-height: normal; font-family: 'menlo'; margin: 0px;" class="" data-mce-style="font-size: 11px; line-height: normal; font-family: 'menlo'; margin: 0px;">iterate((<span style="color: #272ad8;" class="" data-mce-style="color: #272ad8;">0</span>,<span style="color: #272ad8;" class="" data-mce-style="color: #272ad8;">1</span>), apply: { ($1, $0+$1) }).lazy.map({$1})<br class=""></div></div><div class=""> </div><div class="">-Kevin Ballard<br class=""></div><div class=""> </div><blockquote type="cite" class=""><div class=""><blockquote style="border-left-width: 1px; border-left-color: #cccccc; border-left-style: solid; padding-left: 1ex; margin: 0px 0px 0px 0.8ex;" class="" data-mce-style="border-left-width: 1px; border-left-color: #cccccc; border-left-style: solid; padding-left: 1ex; margin: 0px 0px 0px 0.8ex;"><div class=""><blockquote style="border-left-width: 1px; border-left-color: #cccccc; border-left-style: solid; padding-left: 1ex; margin: 0px 0px 0px 0.8ex;" class="" data-mce-style="border-left-width: 1px; border-left-color: #cccccc; border-left-style: solid; padding-left: 1ex; margin: 0px 0px 0px 0.8ex;"><div class="">On Mon, Dec 28, 2015, at 03:59 PM, Kevin Ballard wrote:<br class=""></div><div class="">><br class=""></div><div class="">> ## Detailed design<br class=""></div><div class="">><br class=""></div><div class="">> We add the following extension to SequenceType:<br class=""></div><div class="">><br class=""></div><div class="">> extension SequenceType {<br class=""></div><div class="">> func scan<T>(initial: T, @noescape combine: (T, Self.Generator.Element) throws -> T) rethrows -> [T]<br class=""></div><div class="">> func dropWhile(@noescape dropElement: (Self.Generator.Element) throws -> Bool) rethrows -> [Self.Generator.Element]<br class=""></div><div class="">> func takeWhile(@noescape takeElement: (Self.Generator.Element) throws -> Bool) rethrows -> [Self.Generator.Element]<br class=""></div><div class="">> }<br class=""></div><div class="">><br class=""></div></blockquote></div></blockquote></div></blockquote></div></div></blockquote></div><div class=""> </div><div class=""><img alt="" style="min-height: 1px; width: 1px; border-width: 0px; padding: 0px; margin: 0px;" class="" data-mce-style="min-height: 1px; width: 1px; border-width: 0px; padding: 0px; margin: 0px;" border="0" height="1" width="1"><br class=""></div></div><div class="">_______________________________________________<br class=""></div><div class="">swift-evolution mailing list<br class=""></div><div class=""><a href="mailto:swift-evolution@swift.org" class="" data-mce-href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br class=""></div><div class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="" data-mce-href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></div></blockquote></div></div><div class=""><img alt="" style="min-height: 1px; width: 1px; border-width: 0px; padding: 0px; margin: 0px;" class="" data-mce-style="min-height: 1px; width: 1px; border-width: 0px; padding: 0px; margin: 0px;" border="0" height="1" width="1"><br class=""></div></div></blockquote><blockquote type="cite" class=""><div class=""><div class=""><span class="">_______________________________________________</span><br class=""></div><div class=""><span class="">swift-evolution mailing list</span><br class=""></div><div class=""><span class=""><a href="mailto:swift-evolution@swift.org" class="" data-mce-href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a></span><br class=""></div><div class=""><span class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="" data-mce-href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br class=""></div></div></blockquote><div class=""><img alt="" style="min-height: 1px; width: 1px; border-width: 0px; padding: 0px; margin: 0px;" class="" data-mce-style="min-height: 1px; width: 1px; border-width: 0px; padding: 0px; margin: 0px;" border="0" height="1" width="1"><br class=""></div><div class=""><u class="">_______________________________________________</u><br class=""></div><div class="">swift-evolution mailing list<br class=""></div><div class=""><a href="mailto:swift-evolution@swift.org" class="" data-mce-href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br class=""></div><div class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="" data-mce-href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote><div class=""> </div><div class=""><img style="min-height: 1px; width: 1px; border-width: 0px; padding: 0px; margin: 0px;" alt="" class="" data-mce-style="min-height: 1px; width: 1px; border-width: 0px; padding: 0px; margin: 0px;" border="0" height="1" width="1"><br class=""></div></div><div class="">_______________________________________________<br class=""></div><div class="">swift-evolution mailing list<br class=""></div><div class=""><a href="mailto:swift-evolution@swift.org" class="" data-mce-href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br class=""></div><div class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="" data-mce-href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></div></blockquote></div></div></div></div></div></blockquote><div class=""> </div></div></div></div><br class="">_______________________________________________<br class=""> swift-evolution mailing list<br class=""> <a href="mailto:swift-evolution@swift.org" class="" data-mce-href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br class=""> <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="" data-mce-href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""> <br class=""></blockquote></div><br class=""></div></div></blockquote></div><br class=""></div></blockquote></div></div></body></html>