-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathInfixFunction.kt
46 lines (37 loc) · 1.52 KB
/
InfixFunction.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
package com.arindam.kotlin.x
import com.arindam.kotlin.x.Medium.EMAIL
import com.arindam.kotlin.x.Medium.SMS
import com.arindam.kotlin.x.VisaDecision.APPROVED
import com.arindam.kotlin.x.VisaDecision.REJECTED
/**
* Infix functions can lay the foundations for building 🏛️ interesting DSLs in Kotlin.
*
* Created by Arindam Karmakar on 7/8/19.
*/
enum class VisaDecision { APPROVED, REJECTED }
enum class Medium { EMAIL, SMS }
data class EntryClearanceOfficer(val firstName: String, val lastName: String)
data class VisaApplication(val applicantName: String)
infix fun EntryClearanceOfficer.process(application: VisaApplication): VisaDecision {
val officerFullName = "${this.firstName} ${this.lastName}"
return if (application.applicantName == "Arindam") {
println("$officerFullName processing ${application.applicantName}'s application #${application.hashCode()}")
APPROVED
} else {
println("Sorry, $officerFullName is rejected ${application.applicantName}'s application #${application.hashCode()}")
REJECTED
}
}
infix fun VisaDecision.sendIntimationVia(medium: Medium) {
when (medium) {
EMAIL -> println("Sending intimation via $medium")
SMS -> println("Retrying again via $medium")
}
}
fun main() {
val johnDoe = EntryClearanceOfficer("John", "Doe")
val myVisaApplication = VisaApplication("Mary")
val decision = johnDoe process myVisaApplication
decision sendIntimationVia if (decision == APPROVED) EMAIL else SMS
println(decision) // > REJECTED
}