<div dir="ltr">Agree, this is a nice addition as-is.<div class="gmail_extra"><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 31, 2017 at 10:42 AM, Sean Heber via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I like it.<br>
<br>
l8r<br>
Sean<br>
<div><div class="h5"><br>
<br>
&gt; On Mar 31, 2017, at 10:28 AM, Ben Cohen via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; Hi,<br>
&gt;<br>
&gt; A short proposal for you as part of the algorithms theme. Hopefully non-controversial, aside from the naming of the method and arguments, about which controversy abounds. Online copy here: <a href="https://github.com/airspeedswift/swift-evolution/blob/9a778e904c9be8a3692edd19bb757b23c54aacbe/proposals/0162-all-algorithm.md" rel="noreferrer" target="_blank">https://github.com/<wbr>airspeedswift/swift-evolution/<wbr>blob/<wbr>9a778e904c9be8a3692edd19bb757b<wbr>23c54aacbe/proposals/0162-all-<wbr>algorithm.md</a><br>
&gt;<br>
&gt;<br>
&gt; Add an all algorithm to Sequence<br>
&gt;<br>
&gt;       • Proposal: SE-NNNN<br>
&gt;       • Authors: Ben Cohen<br>
&gt;       • Review Manager: TBD<br>
&gt;       • Status: Awaiting review<br>
&gt; Introduction<br>
&gt;<br>
&gt; It is common to want to confirm that every element of a sequence equals a value, or matches a certain criteria. Many implementations of this can be found in use on github. This proposal adds such a method to Sequence.<br>
&gt;<br>
&gt; Motivation<br>
&gt;<br>
&gt; You can achieve this in Swift 3 with contains by negating both the criteria and the result:<br>
&gt;<br>
&gt; // every element is 9<br>
&gt;<br>
&gt; !nums.<br>
&gt; contains { $0 != 9<br>
&gt;  }<br>
&gt;<br>
&gt; // every element is odd<br>
&gt;<br>
&gt; !nums.<br>
&gt; contains { !isOdd($0) }<br>
&gt; but these are a readability nightmare. Additionally, developers may not make the leap to realize contains can be used this way, so may hand-roll their own for loop, which could be buggy, or compose other inefficient alternatives:<br>
&gt;<br>
&gt; // misses opportunity to bail early<br>
&gt;<br>
&gt; nums.<br>
&gt; reduce(true) { $0.0 &amp;&amp; $0.1 == 9<br>
&gt;  }<br>
&gt;<br>
&gt; // the most straw-man travesty I could think of...<br>
&gt; Set(nums).count == 1 &amp;&amp; Set(nums).first == 9<br>
&gt; Proposed solution<br>
&gt;<br>
&gt; Introduce two algorithms on Sequence which test every element and return true if they match:<br>
&gt;<br>
&gt; nums.all(equal: 9<br>
&gt; )<br>
&gt; nums.all(match: isOdd)<br>
&gt;<br>
&gt; Detailed design<br>
&gt;<br>
&gt; Add the following extensions to Sequence:<br>
&gt;<br>
&gt; extension Sequence<br>
&gt; {<br>
&gt;<br>
&gt; /// Returns a Boolean value indicating whether every element of the sequence<br>
&gt;<br>
&gt;<br>
&gt; /// satisfies the given predicate.<br>
&gt;<br>
&gt;<br>
&gt; func all(match criteria: (Iterator.Element) throws -&gt; Bool) rethrows -&gt; Bool<br>
&gt;<br>
&gt; }<br>
&gt;<br>
&gt;<br>
&gt; extension Sequence where Iterator.Element: Equatable<br>
&gt; {<br>
&gt;<br>
&gt; /// Returns a Boolean value indicating whether every element of the sequence<br>
&gt;<br>
&gt;<br>
&gt; /// equals the given element.<br>
&gt;<br>
&gt;<br>
&gt; func all(equal element: Iterator.Element) -&gt; Bool<br>
&gt;<br>
&gt; }<br>
&gt;<br>
&gt; Source compatibility<br>
&gt;<br>
&gt; This change is purely additive so has no source compatibility consequences.<br>
&gt;<br>
&gt; Effect on ABI stability<br>
&gt;<br>
&gt; This change is purely additive so has no ABI stability consequences.<br>
&gt;<br>
&gt; Effect on API resilience<br>
&gt;<br>
&gt; This change is purely additive so has no API resilience consequences.<br>
&gt;<br>
&gt; Alternatives considered<br>
&gt;<br>
&gt; Not adding it.<br>
</div></div>&gt; ______________________________<wbr>_________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
<br>
______________________________<wbr>_________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
</blockquote></div><br></div></div>