safe scopes

This commit is contained in:
Roland Grinis 2021-07-09 08:46:57 +01:00
parent 6384182593
commit 7744880ce7

View File

@ -9,7 +9,7 @@ private typealias Disposable = () -> Unit
public class NoaScope {
private val disposables: ArrayDeque<Disposable> = ArrayDeque(0)
internal val disposables: ArrayDeque<Disposable> = ArrayDeque(0)
public fun disposeAll() {
disposables.forEach(Disposable::invoke)
@ -20,15 +20,30 @@ public class NoaScope {
disposables += {
try {
disposable()
} catch (ignored: Throwable) {
} catch (e: Throwable) {
}
}
}
internal fun addAll(scope: NoaScope) {
disposables.addAll(scope.disposables)
}
}
internal inline fun <R> withNoaScope(block: NoaScope.() -> R): R {
internal fun <R> withNoaScope(block: NoaScope.() -> R): R? {
val noaScope = NoaScope()
val result = noaScope.block()
val result = try { noaScope.block() } catch (e: Throwable) { null }
noaScope.disposeAll()
return result
}
internal fun <R> withNoaScope(scope: NoaScope, block: NoaScope.() -> R): R? {
val noaScope = NoaScope()
val result = try { noaScope.block() } catch (e: Throwable) { null }
if (result == null){
noaScope.disposeAll()
} else {
scope.addAll(noaScope)
}
return result
}