Skip to content

Instantly share code, notes, and snippets.

@kgn
Last active August 19, 2019 05:41
Show Gist options
  • Save kgn/b248a23835a204b626904c438c3f1302 to your computer and use it in GitHub Desktop.
Save kgn/b248a23835a204b626904c438c3f1302 to your computer and use it in GitHub Desktop.
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 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 multiple Person objects
init(@PeopleBuilder _ builder: () -> [Person]) {
self.people = builder()
}
}
Table {
Family("Mr. & Mrs. Smith") {
Person("Mr. John Smith", .beef)
Person("Mrs. Jane Smith", .chicken)
}
Person("Mr. Ed Ford", .chicken)
Person("Mrs. 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)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment