Skip to content

Instantly share code, notes, and snippets.

fun main(args: Array<String>) {
val contactResult: Result<ContactInfo> = ::ContactInfo.curry()
.on(PersonalName.of("Foo", "Bar", "J."))
.on(Email.Unverified.of("foo.bar@gmail.com"))
.result
contactResult
.map { contact ->
when(contact.email){
is Email.Unverified -> EmailVerificationService.verify(contact.email)
val contact: Result<ContactInfo> = ::ContactInfo.curry()
.on(PersonalName.of("Foo", "Bar", "J."))
.on(Email.Unverified.of("foo.bar@gmail.com"))
.result
class PasswordResetService(){
fun send(email: Email.Verified): Unit = TODO("send reset")
}
class EmailVerificationService(){
fun verify(unverifiedEmail: Email.Unverified): Email.Verified? =
if(incredibleConditions())Email.Verified(unverifiedEmail) else null
private fun incredibleConditions() = true
}
data class ContactInfo(
val name: PersonalName,
val email: Email)
data class PersonalName(
val firstname: NotEmptyString,
val middleInitial: NotEmptyString?,
val lastname: NotEmptyString){
... // construction code here
sealed class Email(val value: String){
data class Verified(private val email: Unverified): Email(email.value)
class Unverified private constructor(value: String): Email(value){
companion object{
fun of(value: String): Result<Email.Unverified> = valikate {
validate(Email.Unverified(value)){
validate(Email.Unverified::value).isEmail()
}
}
}
fun sendPasswordRecovery(email: Email.Verified) { sendTo(email.value) }
fun sendPasswordRecovery(email: Email) { if(email.verified) sendTo(email.value) }
data class Email(
val value: String,
val isVerified: Boolean)
sealed class Email(open val value: String){
data class Verified(private val email: Unverified): Email(email.value)
data class Unverified(override val value: String): Email(value)
}
data class PersonalName(
val firstname: NotEmptyString,
val middleInitial: NotEmptyString?,
val lastname: NotEmptyString){
companion object {
fun of(firstname: String, lastname: String, middleInitial: String? = null): Result<PersonalName> =
::PersonalName.curry()
.on(NotEmptyString.of(firstname))
.on(middleInitial?.run { NotEmptyString.of(middleInitial) } ?: null.ok())