Skip to content

Instantly share code, notes, and snippets.

@rozkminiacz
Created May 21, 2019 13:01
Show Gist options
  • Save rozkminiacz/62521a39fefb605376c379160808e9b7 to your computer and use it in GitHub Desktop.
Save rozkminiacz/62521a39fefb605376c379160808e9b7 to your computer and use it in GitHub Desktop.
Memoized based on Spek implementation
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
interface Memoized {
fun <T> memoized(factory: () -> T): Memoizable<T>
}
class DefaultMemoized : Memoized {
override fun <T> memoized(factory: () -> T): Memoizable<T> {
return MemoizableAdapter(factory)
}
}
interface Memoizable<out T> : ReadOnlyProperty<Any?, T> {
operator fun invoke(): T
}
class MemoizableAdapter<T>(val factory: () -> T) : Memoizable<T> {
var cached: T? = null
override fun getValue(thisRef: Any?, property: KProperty<*>): T = invoke()
override fun invoke(): T {
if (cached == null) {
cached = factory()
}
return cached!!
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment