extension Array where Element == Int { func fizzBuzz() -> [String] { return self.map(evalBuilder(pickers: [fibui(3, "Fizz"), fibui(5, "Buzz"), fibui(7, "Humm")])) } private func fibui(_ mult: Int, _ out: String) -> ((Int)->String?) { return { (number: Int) in number.isMultiple(of: mult) ? out : nil } } private func evalBuilder(pickers:[(Int)->String?]) -> ((Int)->String) { return { (number: Int) in let output = pickers.compactMap { f in return f(number) } return output.isEmpty ? "\(number)" : output.joined() } } } let array = Array(1...20) print(array.fizzBuzz())