[swift-evolution] Proposal: Filter split extension on Sequence to return tuple of sequences that meet criteria and that do not

Dave Abrahams dabrahams at apple.com
Wed Jun 8 16:43:12 CDT 2016


on Wed Jun 08 2016, Nate Cook <natecook-AT-gmail.com> wrote:

>> On Jun 8, 2016, at 3:40 PM, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
>> 
>> 
>> on Wed Jun 08 2016, Dave Abrahams <swift-evolution at swift.org> wrote:
>> 
>
>>> on Wed Jun 08 2016, gadiraju praneeth <swift-evolution at swift.org> wrote:
>>> 
>>>> Many times, I came across a scenario where I had to filter an array with a
>>>> condition and filter the same array with opposite of that condition. For
>>>> example:
>>>> 
>>>> let values = [2, 4, 3, 5, 6, 9]
>>>> 
>>>> let divisibleByTwo = values.filter { $0 % 2 == 0 }
>>>> let notDivisibleByTwo = values.filter { $0 % 2 != 0 }
>>>> 
>>>> Is there a way currently where we can filter the array into two arrays
>>>> based on a condition?
>>> 
>>> Well, you need a stable partition for this if you care about ordering
>>> (see
>>> https://github.com/apple/swift/blob/master/test/Prototypes/Algorithms.swift#L299)
>>> but then you can do 
>>> 
>>> var parts = values
>>> let mid = values.stablePartition { $0 % 2 == 0 }
>>> let divisibleByTwo = parts.prefix(upTo: mid)
>>> let notDivisibleByTwo = parts.suffix(from: mid)
>>> 
>>> Nate Cook has an enhancement to the result of stablyPartitioned in that
>>> prototype that would let you write:
>>> 
>>>  let parts = values.stablyPartitioned { $0 % 2 == 0 }
>>>  let divisibleByTwo = parts.prefix(upTo: parts.partitionPoint)
>>>  let notDivisibleByTwo = parts.suffix(from: parts.partitionPoint)
>
> Mine was for the result of the 'rotated' methods, but should work for
> the partitioning ones, too. It's not as clear to me what the benefit
> of the "lazy" partitioning in that Algorithm.swift is

Just to pass “laziness” on from the result, so further computations can
also be lazy.

> —wouldn't it be better to wrap a collection around two lazy filter
> sequences?

Perhaps something like a
LazyFlatMap<CollectionOfTwo<LazyFilterCollection>> would be better, but
I have the concern that this would evaluate the predicate 2N times for
each traversal.

> Here is a quick proof of concept of 'divided' and 'partitioned'
> methods:
> http://swiftlang.ng.bluemix.net/#/repl/57588cbda79b317716f02e04
>
>> Hmm, come to think of it, Nate, maybe there should also be a more
>> convenient way to get the two partitions from the result.
>
> Definitely!
>
> Nate
>
>> -- 
>> Dave
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution

-- 
Dave


More information about the swift-evolution mailing list