Advertisement
Guest User

Untitled

a guest
Sep 18th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 KB | None | 0 0
  1. package mnm.mods.tabbychat.util.config
  2.  
  3. import com.google.common.reflect.TypeToken
  4. import kotlin.reflect.KProperty
  5.  
  6. sealed class AbstractValue<T> {
  7. abstract val type: TypeToken<T>?
  8. abstract val value: T
  9.  
  10. override fun toString(): String {
  11. return value.toString()
  12. }
  13. }
  14.  
  15. class Value<T>(
  16. override val type: TypeToken<T>,
  17. val default: () -> T) : AbstractValue<T>() {
  18. override var value = default()
  19.  
  20. fun reset() {
  21. value = default()
  22. }
  23. }
  24.  
  25. class ValueList<T>(
  26. override val type: TypeToken<MutableList<T>>,
  27. override val value: MutableList<T> = mutableListOf()
  28. ) : AbstractValue<MutableList<T>>(), MutableList<T> by value
  29.  
  30. class ValueMap<T>(
  31. override val type: TypeToken<MutableMap<String, T>>,
  32. override val value: MutableMap<String, T> = mutableMapOf()
  33. ) : AbstractValue<MutableMap<String, T>>(), MutableMap<String, T> by value
  34.  
  35. abstract class ValueObject<T : ValueObject<T>> : AbstractValue<T>() {
  36. override val type: Nothing? = null
  37. @Suppress("UNCHECKED_CAST")
  38. override val value: T
  39. get() = this as T
  40.  
  41. internal val properties: MutableMap<String, AbstractValue<out Any>> = mutableMapOf()
  42.  
  43. protected inline fun <reified T : Any> value(noinline default: () -> T) = ValueDelegate {
  44. Value(typeToken(), default)
  45. }
  46.  
  47. protected inline fun <reified T : Any> list() = ValueDelegate {
  48. ValueList<T>(typeToken())
  49. }
  50.  
  51. protected inline fun <reified T> map() = ValueDelegate {
  52. ValueMap<T>(typeToken())
  53. }
  54.  
  55. protected fun <T : ValueObject<T>> obj(default: () -> T) = ValueDelegate(default)
  56.  
  57. protected inline fun <reified T> typeToken() = object : TypeToken<T>() {}
  58. }
  59.  
  60.  
  61. class ValueDelegate<V : AbstractValue<T>, T : Any>(val factory: () -> V) {
  62.  
  63. @Suppress("UNCHECKED_CAST")
  64. operator fun getValue(thisRef: ValueObject<*>, property: KProperty<*>): V {
  65. return thisRef.properties.getOrPut(property.name) {
  66. factory()
  67. } as V
  68. }
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement