package blitz fun caching(tiedGet: Provider, calc: (T) -> O) = object : Lazy { private var lastTiedV = tiedGet() private var lastV: O? = null override val value: O get() { val nTied = tiedGet() if (lastTiedV != nTied) { lastTiedV = nTied lastV = calc(nTied) return lastV!! } if (lastV == null) lastV = calc(nTied) return lastV!! } override fun isInitialized(): Boolean = lastTiedV == tiedGet() && lastV != null }