🎨 Replace default option with Kotlin version
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / utils / DefaultOption.kt
diff --git a/src/main/kotlin/net/pterodactylus/sone/utils/DefaultOption.kt b/src/main/kotlin/net/pterodactylus/sone/utils/DefaultOption.kt
new file mode 100644 (file)
index 0000000..5f75e12
--- /dev/null
@@ -0,0 +1,30 @@
+package net.pterodactylus.sone.utils
+
+import java.util.function.Predicate
+
+/**
+ * Basic implementation of an [Option].
+ *
+ * @param <T> The type of the option
+ */
+class DefaultOption<T> @JvmOverloads constructor(
+               private val defaultValue: T,
+               private val validator: ((T) -> Boolean)? = null
+) : Option<T> {
+
+       @Volatile
+       private var value: T? = null
+
+       override fun get() = value ?: defaultValue
+
+       override fun getReal(): T? = value
+
+       override fun validate(value: T?): Boolean =
+                       value == null || validator?.invoke(value) ?: true
+
+       override fun set(value: T?) {
+               require(validate(value)) { "New Value ($value) could not be validated." }
+               this.value = value
+       }
+
+}