All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.ru.casperix.signals.concrete.EitherSignal.kt Maven / Gradle / Ivy

There is a newer version: 1.8.2
Show newest version
package ru.casperix.signals.concrete

import ru.casperix.signals.api.CustomFuture

/**
 * 	Сигнал ожидания события: "успех" ИЛИ "неудача"
 * 	Событие происходит только однажды и состояние фиксируется.
 *
 * 	Вы можете подписаться в любой момент
 * 	Слушатель получит свое значение когда оно появится (или немедленно, если сигнал уже сработал)
 *
 * 	Удобно использовать когда есть два варианта исхода, например загрузка ассетов
 *
 * 	val loadSignal = EitherSignal()
 * 	...
 * 	loadSignal.accept(Image())
 * 	loadSignal.reject(ImageLoadError())
 * 	...
 * 	loadSignal.thenAccept{
 * 		drawImage(it)
 * 	}
 * 	loadSignal.thenReject {
 * 		printError(it)
 * 	}
 *
 */
class EitherSignal : EitherPromise {
	private val acceptSignal = SingleSignal()
	private val rejectSignal = SingleSignal()
	override var complete = false; private set

	override fun accept(accept: Accept) {
		if (!complete) {
			complete = true
			acceptSignal.set(accept)
		}
	}

	override fun reject(reject: Reject) {
		if (!complete) {
			complete = true
			rejectSignal.set(reject)
		}
	}

	fun dropResult() {
		acceptSignal.dropResult()
		rejectSignal.dropResult()
		complete = false
	}

	override val acceptDispatcher: (Accept) -> Unit = ::accept
	override val rejectDispatcher: (Reject) -> Unit = ::reject

	override val acceptFuture: CustomFuture<(Accept) -> Unit, Slot> = acceptSignal

	override val rejectFuture: CustomFuture<(Reject) -> Unit, Slot> = rejectSignal
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy