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

Nate Cook natecook at gmail.com
Wed Jun 8 16:24:11 CDT 2016


> 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—wouldn't it be better to wrap a collection around two lazy filter sequences?

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



More information about the swift-evolution mailing list