Skip to content

Instantly share code, notes, and snippets.

@kgn
Created August 19, 2019 06:01
Show Gist options
  • Save kgn/0aa34a4c8d07a050e0380ecd4466cb14 to your computer and use it in GitHub Desktop.
Save kgn/0aa34a4c8d07a050e0380ecd4466cb14 to your computer and use it in GitHub Desktop.
enum Food: String {
case beef = "Beef"
case chicken = "Chicken"
case vegitarian = "Vegitarian"
case kids = "Kids"
}
protocol People {
var people: [Person] { get }
}
@_functionBuilder
struct PeopleBuilder {
static func buildBlock(_ people: People...) -> [Person] {
return people.reduce([], {$0+$1.people})
}
}
struct Person: People {
let name: String
let food: Food
var people: [Person] { [self] }
init(_ name: String, _ food: Food) {
self.name = name
self.food = food
}
}
struct Family: People {
let name: String
private let members: [Person]
var people: [Person] { members }
// For blocks that return just 1 Person object
init(_ name: String, @PeopleBuilder _ builder: () -> Person) {
self.name = name
self.members = [builder()]
}
// For blocks that return just multiple Person objects
init(_ name: String, @PeopleBuilder _ builder: () -> [Person]) {
self.name = name
self.members = builder()
}
}
struct Table {
let people: [Person]
// For blocks that return just 1 Person object
init(@PeopleBuilder _ builder: () -> Person) {
self.people = [builder()]
}
// For blocks that return just multiple Person objects
init(@PeopleBuilder _ builder: () -> [Person]) {
self.people = builder()
}
}
let tables = [
Table {
Family("Mr. & Mrs. Smith") {
Person("Mr. John Smith", .beef)
Person("Mrs. Jane Smith", .chicken)
}
Person("Mr. Ed Ford", .chicken)
Person("Ms. Amanda Doolittle", .vegitarian)
Family("Mr. & Mrs. Appleseed") {
Person("Mr. Jonny Appleseed", .chicken)
Person("Mrs. Jessica Appleseed", .vegitarian)
Person("Timmy Appleseed", .kids)
}
Family("Mr. & Mrs. Doe") {
Person("Mr. James Doe", .chicken)
Person("Mrs. Janice Doe", .beef)
Person("James Doe Jr.", .kids)
}
}
]
for (i, table) in tables.enumerated() {
print("Table #\(i+1)")
print(table.people
.map{"\($0.name),\($0.food.rawValue)"}
.joined(separator: "\n")
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment