Skip to content

Commit

Permalink
Fix Providers mapping each time, Fix #15
Browse files Browse the repository at this point in the history
Signed-off-by: shedaniel <[email protected]>
  • Loading branch information
shedaniel committed Aug 19, 2021
1 parent 4176e5f commit cf92047
Showing 1 changed file with 23 additions and 3 deletions.
26 changes: 23 additions & 3 deletions src/main/kotlin/me/shedaniel/linkie/discord/utils/Provider.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,35 @@ fun interface Provider<T : Any> {
val <T : Any> T.provider: Provider<T>
get() = Provider { this }

val <T : Any> Provider<T>.lazy: Provider<T>
get() {
val value by lazy { this.get() }
return Provider { value }
}

fun <T : Any, R : Any> Provider<T>.map(mapper: (T) -> R): Provider<R> =
Provider { mapper(get()) }

interface Property<T : Any> : Provider<T> {
fun set(value: T): Property<T> = set(value.provider)
fun set(value: Provider<T>): Property<T>
fun listen(listener: (Provider<T>) -> Unit)

companion object {
fun <T : Any> create(): Property<T> = object : Property<T> {
var value by Delegates.notNull<Provider<T>>()
val listeners = mutableListOf<(Provider<T>) -> Unit>()
override fun set(value: Provider<T>): Property<T> = apply {
this.value = value
this.listeners.forEach { listener ->
listener(this.value)
}
}

override fun get(): T = value.get()
override fun get(): T = this.value.get()
override fun listen(listener: (Provider<T>) -> Unit) {
this.listeners.add(listener)
}
}

fun <T : Any> create(initialValue: T): Property<T> = create(initialValue.provider)
Expand All @@ -47,5 +64,8 @@ interface Property<T : Any> : Provider<T> {
val <T : Any> T.property: Property<T>
get() = Property.create(this)

fun <T : Any, R : Any> Property<T>.map(mapper: (T) -> R): Property<R> =
Property.create { mapper(this@map.get()) }
fun <T : Any, R : Any> Property<T>.map(mapper: (T) -> R): Property<R> {
val property: Property<R> = Property.create(Provider { get() }.map(mapper).lazy)
listen { property.set(it.map(mapper).lazy) }
return property
}

0 comments on commit cf92047

Please sign in to comment.