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<R, T>(private val getter: (R) -> T?, private val receivers: ImmutableList<R>) : ReadOnlyProperty<Any?, T?> {
	constructor(getter: (R) -> T?, receivers: Stream<R>) : this(getter, receivers.collect(ImmutableList.toImmutableList()))
	constructor(getter: (R) -> T?, receivers: Array<out R>) : this(getter, ImmutableList.copyOf(receivers))
	constructor(getter: (R) -> T?, receivers: List<R>) : 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
	}
}
