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:
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.
2 replies on “Demonstrating map, filter, and reduce in Swift using food emoji”
[…] Demonstrating map, filter, and reduce in Swift using food emoji […]
[…] I didn’t want to stop at just making a graphic based on Steven Luscher’s tweet — I wanted to build on it by making it real! So I implemented these emoji functions in Swift… […]