Skip to content

Instantly share code, notes, and snippets.

@darylsze
Last active October 8, 2020 12:19
Show Gist options
  • Save darylsze/eb2d198389e9806feb20e5ef51ce9222 to your computer and use it in GitHub Desktop.
Save darylsze/eb2d198389e9806feb20e5ef51ce9222 to your computer and use it in GitHub Desktop.
interface IResettable {
fun reset()
}
open class ResettableAspect: IResettable {
val delegateManager by lazy {
ResettableDelegateManager()
}
override fun reset() {
delegateManager.reset()
}
}
class ResettableDelegateManager : IResettable {
val delegates = LinkedList<IResettable>()
override fun reset() {
delegates.forEach {
it.reset()
}
}
fun <PROPTYPE> register(instance: ResettableDelegate<PROPTYPE>) {
delegates.add(instance)
}
}
class ResettableDelegate<PROPTYPE>(sourceManager: ResettableDelegateManager, val init: () -> PROPTYPE) : ReadWriteProperty<Any?, PROPTYPE>, IResettable {
init {
sourceManager.register(this)
}
var currentValue = init()
override operator fun getValue(thisRef: Any?, property: KProperty<*>): PROPTYPE {
return currentValue
}
override fun setValue(thisRef: Any?, property: KProperty<*>, value: PROPTYPE) {
currentValue = value
}
override fun reset() {
currentValue = init()
}
}
// usage
object Measurement: ResettableAspect() {
var loadTimeStart by ResettableDelegate(delegateManager) { 0L }
var loadTimeEnd by ResettableDelegate(delegateManager) { 0L }
}
fun main() {
Measurement.loadTimeStart = now() // presudo
...
Measurement.loadTimeEnd = now() // presudo
val diff = Measurement.loadTimeEnd - Measurement.loadTimeStart
println("it takes $diff ms!)
Measurement.reset()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment