package ru.dbotthepony.kstarbound.util import com.google.common.collect.ImmutableList import java.util.stream.Stream import kotlin.properties.ReadOnlyProperty import kotlin.reflect.KProperty class VirtualProperty(private val getter: (R) -> T?, private val receivers: ImmutableList) : ReadOnlyProperty { constructor(getter: (R) -> T?, receivers: Stream) : this(getter, receivers.collect(ImmutableList.toImmutableList())) constructor(getter: (R) -> T?, receivers: Array) : this(getter, ImmutableList.copyOf(receivers)) constructor(getter: (R) -> T?, receivers: List) : this(getter, ImmutableList.copyOf(receivers)) override fun getValue(thisRef: Any?, property: KProperty<*>): T? { for (receiver in receivers) { val value = getter.invoke(receiver) if (value != null) { return value } } return null } }