> 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?
> 
> 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

Dave's got a pretty nice solution for the true-or-false case. If SE-0100 ("Add 
sequence-based initializers and merge methods to Dictionary", 
https://github.com/apple/swift-evolution/blob/master/proposals/0100-add-sequence-based-init-and-merge-to-dictionary.md)
 is accepted, you could also write an N-way, key-based version that works with 
any type:

        let pairs = values.map { ($0 % 3, [$0]) }
        let byThrees: [Int: Int] = Dictionary(merging: pairs, combine: +)

One could also imagine an array-based N-way version, though I'm not aware of a 
particularly easy-to-write implementation for it.

        extension Collection {
                func partition(by indexer: @noescape (Element) throws -> Int) 
rethrows -> [[Iterator.Element]] {
                        var output = [] as [[Iterator.Element]]
                        
                        for elem in self {
                                let index = try indexer(elem)
                                while index >= output.endIndex {
                                        output.append([])
                                }
                                output[index].append(elem)
                        }
                        
                        return output
                }
        }
        
        let byThrees: [Int] = values.partition { $0 % 3 }

-- 
Brent Royal-Gordon
Architechies

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to