package net.pterodactylus.sone.utils class Memoize(private val calc: (T) -> R) : (T) -> R { private val values = mutableMapOf() override fun invoke(value: T) = values.getOrPut(value, { calc(value) }) } fun ((T) -> R).memoize(): (T) -> R = Memoize(this)