package me.eternal.purrfect.common.util import android.os.IInterface open class LazyBridgeValue( private val block: () -> T, private val isConstant: Boolean = false ): Lazy { private val lock = Any() private var _value: T? = null override val value: T get() = run { synchronized(lock) { if (_value == null || (!isConstant && !_value!!.asBinder().pingBinder())) { _value = block() } } return _value!! } override fun isInitialized(): Boolean { return _value != null && (isConstant || _value!!.asBinder().pingBinder()) } operator fun getValue(thisRef: Any?, property: Any?): T { return value } } fun mappedLazyBridge(lazyBridgeValue: LazyBridgeValue, map: (T) -> R): Lazy { return object : Lazy { private var _value: T? = null private var _mappedValue: R? = null override val value: R get() = run { if (_value != lazyBridgeValue.value) { _value = lazyBridgeValue.value _mappedValue = map(_value!!) } return _mappedValue!! } override fun isInitialized(): Boolean = lazyBridgeValue.isInitialized() } } fun lazyBridge(block: () -> T) = LazyBridgeValue(block) fun constantLazyBridge(value: () -> T) = LazyBridgeValue(value, isConstant = true)