forked from kscience/kmath
Add draft of multiplatform DeferScope
This commit is contained in:
parent
758508ba96
commit
0b784474b4
@ -0,0 +1,7 @@
|
||||
package kscience.kmath.memory
|
||||
|
||||
public expect class DeferScope {
|
||||
public inline fun defer(crossinline block: () -> Unit)
|
||||
}
|
||||
|
||||
public expect inline fun <R> withDeferScope(block: DeferScope.() -> R): R
|
@ -0,0 +1,30 @@
|
||||
package kscience.kmath.memory
|
||||
|
||||
private typealias Deferred = () -> Unit
|
||||
|
||||
public actual class DeferScope {
|
||||
@PublishedApi
|
||||
internal val deferred: MutableList<Deferred> = mutableListOf()
|
||||
|
||||
@PublishedApi
|
||||
internal fun executeAllDeferred() {
|
||||
deferred.forEach(Deferred::invoke)
|
||||
deferred.clear()
|
||||
}
|
||||
|
||||
public actual inline fun defer(crossinline block: () -> Unit) {
|
||||
deferred += {
|
||||
try {
|
||||
block()
|
||||
} catch (ignored: Throwable) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public actual inline fun <R> withDeferScope(block: DeferScope.() -> R): R {
|
||||
val ds = DeferScope()
|
||||
val r = ds.block()
|
||||
ds.executeAllDeferred()
|
||||
return r
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package kscience.kmath.memory
|
||||
|
||||
private typealias Deferred = () -> Unit
|
||||
|
||||
public actual class DeferScope {
|
||||
@PublishedApi
|
||||
internal val deferred: MutableList<Deferred> = mutableListOf()
|
||||
|
||||
@PublishedApi
|
||||
internal fun executeAllDeferred() {
|
||||
deferred.forEach(Deferred::invoke)
|
||||
deferred.clear()
|
||||
}
|
||||
|
||||
public actual inline fun defer(crossinline block: () -> Unit) {
|
||||
deferred += {
|
||||
try {
|
||||
block()
|
||||
} catch (ignored: Throwable) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public actual inline fun <R> withDeferScope(block: DeferScope.() -> R): R {
|
||||
val ds = DeferScope()
|
||||
val r = ds.block()
|
||||
ds.executeAllDeferred()
|
||||
return r
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package kscience.kmath.memory
|
||||
|
||||
import kotlinx.cinterop.memScoped
|
||||
|
||||
public actual typealias DeferScope = kotlinx.cinterop.DeferScope
|
||||
|
||||
public actual inline fun <R> withDeferScope(block: DeferScope.() -> R): R = memScoped(block)
|
Loading…
Reference in New Issue
Block a user