-
Notifications
You must be signed in to change notification settings - Fork 15
/
Implementation.kt
73 lines (53 loc) · 1.42 KB
/
Implementation.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package co.zsmb.villagedsl.simple.dsl3
import co.zsmb.villagedsl.simple.models.House
import co.zsmb.villagedsl.simple.models.Person
import co.zsmb.villagedsl.simple.models.Village
@DslMarker
annotation class SimpleDsl3
@SimpleDsl3
object village {
@SimpleDsl3
infix fun containing(houses: List<House>) = Village(houses)
}
@SimpleDsl3
object house
@SimpleDsl3
class PeopleListBuilder {
val people = mutableListOf<Person>()
fun build(): List<Person> = people
@SimpleDsl3
infix fun String.age(age: Int) {
people.add(Person(this, age))
}
}
@SimpleDsl3
fun people(actions: PeopleListBuilder.() -> Unit): List<Person> {
val builder = PeopleListBuilder()
builder.actions()
return builder.build()
}
@SimpleDsl3
fun person(actions: PeopleListBuilder.() -> Unit) = people(actions)
@SimpleDsl3
object people
class HouseListBuilder {
private val houses = mutableListOf<House>()
fun build(): List<House> = houses
@SimpleDsl3
infix fun house.with(people: List<Person>) {
houses += House(people)
}
@SimpleDsl3
infix fun house.of(people: List<Person>) = with(people)
@Suppress("UNUSED_PARAMETER")
@SimpleDsl3
infix fun house.without(p: people) {
houses += House(listOf())
}
}
@SimpleDsl3
fun houses(actions: HouseListBuilder.() -> Unit): List<House> {
val builder = HouseListBuilder()
builder.actions()
return builder.build()
}