One of my coworkers asked how to filter a list, but return the “pass” and “fail” items in separate lists. For example, filter takes some data and a condition, and returns a list of the items that pass the condition, but what if we returned two lists? One of my other coworkers came up with a neat solution using reduce, and I wrote something using generics. Here’s the operation I’m calling “fork”, implemented in Swift3.
import Foundation
func fork<T>(_ data: [T], completion: (T)->Bool) -> ([T],[T]) {
var pass = [T]()
var fail = [T]()
for item in data {
completion(item) ? pass.append(item) : fail.append(item)
}
return (pass,fail)
}
var (pass, fail) = fork([0,1,2,3,4]) { $0 % 2 == 0 }