In my last article, I posted this graphic, which uses emoji to make it easier to understand what the map
, filter
, and reduce
functions do:
![map filter reduce in emoji](https://www.globalnerdy.com/wordpress/wp-content/uploads/2016/06/map-filter-reduce-in-emoji-1.png)
Since then, I’ve been asked by a couple of friends if what’s in the graphic is just pseudocode or if it could actually be implemented. I told them it was the latter, and here’s my implementation in Swift:
// Map
func cook(_ item: String) -> String {
let cookupTable = [
"🐮": "🍔", // Cow face -> burger
"🐄": "🍔", // Cow -> burger
"🐂": "🍖", // Ox -> meat on bone
"🐷": "🍖", // Pig face -> meat on bone
"🐽": "🍖", // Pig nose -> meat on bone
"🐖": "🍖", // Pig -> meat on bone
"🐑": "🍖", // Sheep -> meat on bone
"🐐": "🍖", // Goat -> meat on bone
"🐔": "🍗", // Chicken -> poultry leg
"🦃": "🍗", // Turkey -> poultry leg
"🐸": "🍗", // Frog -> poultry leg (no frog leg emoji...yet)
"🐟": "🍣", // Fish -> sushi
"🐠": "🍣", // Tropical fish -> sushi
"🐡": "🍣", // Blowfish -> sushi
"🐙": "🍣", // Octopus -> sushi
"🍠": "🍟", // (Sweet) potato -> French fries
"🌽": "🍿", // Corn -> popcorn
"🌾": "🍚", // Rice -> cooked rice
"🍓": "🍰", // Strawberry -> shortcake
"🍂": "🍵", // Dried leaves -> tea
]
if let cookedFood = cookupTable[item] {
return cookedFood
}
else {
return "🍽" // Empty plate
}
}
let cookedFood = ( ["🐮", "🍠", "⚽️", "🐔", "🌽"].map { cook($0) } )
// cookedFood == ["🍔", "🍟", "🍽", "🍗", "🍿"]
// Filter
func isVegetarian(_ item: String) -> Bool {
let vegetarianDishes = Set([
"🍟", // French fries
"🍿", // Popcorn
"🍚", // Cooked rice
"🍰", // Shortcake
"🍵", // Tea
])
return vegetarianDishes.contains(item)
}
let meatFree = ["🍔", "🍖", "🍟", "🍽", "🍗", "🍿", "🍰"].filter { isVegetarian($0) }
// meatFree == ["🍟", "🍿", "🍰"]
// Reduce
func eat(_ previous: String, _ current: String) -> String {
let qualifyingFood = Set([
"🍔", // Burger
"🍖", // Meat on bone
"🍗", // Poultry leg
"🍣", // Sushi
"🍟", // French fries
"🍿", // Popcorn
"🍚", // Cooked rice
"🍰", // Shortcake
])
if (previous == "" || previous == "💩") && qualifyingFood.contains(current) {
return "💩" // Poop
}
else {
return ""
}
}
let aftermath = ["🍔", "🍟", "🍗", "🍿"].reduce("", combine: eat)
// aftermath == "💩"
I put this into a Swift playground, which you can copy from this Gist or download here.