[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 15:11:20 CDT 2016


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)


> If not how about something like a filterSplit function where we get a tuple
> of values:
>
> values.filterSplit { $0 % 2 == 0 } = ([2,4,6], [3,5,9])
>
> I have implemented this in our project and wanted to get your thoughts on it
> _______________________________________________
> 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