33package com.github.h0tk3y.kotlinMonads
44
55import java.io.Serializable
6- import kotlin.coroutines.Continuation
7- import kotlin.coroutines.EmptyCoroutineContext
8- import kotlin.coroutines.RestrictsSuspension
9- import kotlin.coroutines.intrinsics.SUSPENDED_MARKER
10- import kotlin.coroutines.intrinsics.suspendCoroutineOrReturn
11- import kotlin.coroutines.startCoroutine
6+ import kotlin.coroutines.experimental. Continuation
7+ import kotlin.coroutines.experimental. EmptyCoroutineContext
8+ import kotlin.coroutines.experimental. RestrictsSuspension
9+ import kotlin.coroutines.experimental. intrinsics.COROUTINE_SUSPENDED
10+ import kotlin.coroutines.experimental. intrinsics.suspendCoroutineOrReturn
11+ import kotlin.coroutines.experimental. startCoroutine
1212
1313fun <M : Monad <M , * >, T , R > Monad <M , T >.bindDo (c : suspend DoController <M >.(T ) -> Monad <M , R >): Monad <M , R > =
1414 bind { t ->
@@ -26,23 +26,14 @@ fun <M : Monad<M, *>, R> doReturning(aReturn: Return<M>,
2626 return controller.returnedMonad as Monad <M , R >
2727}
2828
29- private val labelField by lazy {
30- val jClass = Class .forName(" kotlin.jvm.internal.CoroutineImpl" )
31- return @lazy jClass.getDeclaredField(" label" ).apply { isAccessible = true }
32- }
33-
34- private var <T > Continuation <T >.label
35- get() = labelField.get(this )
36- set(value) = labelField.set(this @label, value)
37-
3829@RestrictsSuspension
3930class DoController <M : Monad <M , * >>(private val returning : Return <M >) :
4031 Serializable , Return <M > by returning, Continuation <Monad <M , * >> {
4132
4233 override val context = EmptyCoroutineContext
4334
4435 override fun resume (value : Monad <M , * >) {
45- returnedMonad = value // here is where the biggest magic happens
36+ returnedMonad = value
4637 }
4738
4839 override fun resumeWithException (exception : Throwable ) {
@@ -52,13 +43,13 @@ class DoController<M : Monad<M, *>>(private val returning: Return<M>) :
5243 internal lateinit var returnedMonad: Monad <M , * >
5344
5445 suspend fun <T > bind (m : Monad <M , T >): T = suspendCoroutineOrReturn { c ->
55- val labelHere = c.label // save the label
46+ val labelHere = c.stackLabels // save the whole coroutine stack labels
5647 returnedMonad = m.bind { x ->
57- c.label = labelHere
48+ c.stackLabels = labelHere
5849 c.resume(x)
5950 returnedMonad
6051 }
61- SUSPENDED_MARKER
52+ COROUTINE_SUSPENDED
6253 }
6354
6455 suspend fun <T > then (m : Monad <M , T >): Unit {
0 commit comments