🎨 Replace default option with Kotlin version
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / utils / DefaultOption.kt
1 package net.pterodactylus.sone.utils
2
3 import java.util.function.Predicate
4
5 /**
6  * Basic implementation of an [Option].
7  *
8  * @param <T> The type of the option
9  */
10 class DefaultOption<T> @JvmOverloads constructor(
11                 private val defaultValue: T,
12                 private val validator: ((T) -> Boolean)? = null
13 ) : Option<T> {
14
15         @Volatile
16         private var value: T? = null
17
18         override fun get() = value ?: defaultValue
19
20         override fun getReal(): T? = value
21
22         override fun validate(value: T?): Boolean =
23                         value == null || validator?.invoke(value) ?: true
24
25         override fun set(value: T?) {
26                 require(validate(value)) { "New Value ($value) could not be validated." }
27                 this.value = value
28         }
29
30 }