diff --git a/kmath-noa/src/main/kotlin/space/kscience/kmath/noa/memory/NoaScope.kt b/kmath-noa/src/main/kotlin/space/kscience/kmath/noa/memory/NoaScope.kt index a226fb212..08df2d79b 100644 --- a/kmath-noa/src/main/kotlin/space/kscience/kmath/noa/memory/NoaScope.kt +++ b/kmath-noa/src/main/kotlin/space/kscience/kmath/noa/memory/NoaScope.kt @@ -9,7 +9,7 @@ private typealias Disposable = () -> Unit public class NoaScope { - private val disposables: ArrayDeque = ArrayDeque(0) + internal val disposables: ArrayDeque = 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 withNoaScope(block: NoaScope.() -> R): R { +internal fun 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 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 } \ No newline at end of file