phldavies
04/29/2022, 4:59 PMresource { }
DSL releases resources in the wrong order - see 🧵phldavies
04/29/2022, 5:01 PMimport arrow.fx.coroutines.Resource
import arrow.fx.coroutines.release
import arrow.fx.coroutines.resource
internal infix fun <A, B> Resource<A>.flatTap(resource: (A) -> Resource<B>): Resource<A> =
flatMap { a -> resource(a).map { a } }
suspend fun main() {
fun str(string: String) = resource { string.also { println("acquire($it)") } } release { println("release($it)") }
suspend fun <A> Resource<A>.use() = use { println("use($it)") }
println("-- flatMap --")
str("outer")
.flatMap { str("inner") }
.use { println("use($it)") }
println("-- flatTap --")
str("outer")
.flatTap { str("inner") }
.use { println("use($it)") }
println("-- zip --")
str("outer").zip(str("inner")).use()
}
in 1.0.1 produces
-- flatMap --
acquire(outer)
acquire(inner)
use(inner)
release(inner)
release(outer)
-- flatTap --
acquire(outer)
acquire(inner)
use(outer)
release(inner)
release(outer)
-- zip --
acquire(outer)
acquire(inner)
use((outer, inner))
release(inner)
release(outer)
however 1.1.2 produces (same code, same imports)
-- flatMap --
acquire(outer)
acquire(inner)
use(inner)
release(outer)
release(inner)
-- flatTap --
acquire(outer)
acquire(inner)
use(outer)
release(outer)
release(inner)
-- zip --
acquire(outer)
acquire(inner)
use((outer, inner))
release(outer)
release(inner)
phldavies
04/29/2022, 5:29 PMarrow/fx/coroutines/Resource.kt:727
should be finalizers.update(finalizer::prependTo)
test case
"flatMap resource is released first" {
checkAll(Arb.positiveInt(), Arb.negativeInt()) { a, b ->
val l = mutableListOf<Int>()
fun r(n: Int) = Resource({ n.also(l::add) }, { it, _ -> l.add(-it) })
r(a).flatMap { r(it + b) }
.use { it + 1 } shouldBe (a + b) + 1
l.shouldContainExactly(a, a + b, - a - b, -a)
}
}
would cover it. I’m happy to look into wrapping this up into a PR later this evening - but don’t feel the need to wait for it if you want to fix it yourself or in your own way 😉simon.vergauwen
04/30/2022, 9:23 AMphldavies
04/30/2022, 10:57 AM1.1.3
the next announced release as it would be great to be able to switch. At the moment, 1.1.2 breaks some expectations we have around resource releasing.simon.vergauwen
04/30/2022, 11:52 AMphldavies
05/03/2022, 10:03 AMsimon.vergauwen
05/03/2022, 10:22 AMsimon.vergauwen
05/03/2022, 10:22 AM1.1.3
😭phldavies
05/03/2022, 10:29 AMsimon.vergauwen
05/03/2022, 11:27 AMalpha
pipeline published a stable
pipeline result 😕
This was due to how long the tasks take to run in Github actions, and we're currently fixing the issues to it cannot happen again.phldavies
05/03/2022, 11:39 AMsimon.vergauwen
05/03/2022, 11:52 AMphldavies
05/16/2022, 12:28 PMeffect { }
but this resource { }
bug is a blocker for us 🙂simon.vergauwen
05/16/2022, 12:34 PMsimon.vergauwen
05/16/2022, 12:34 PMphldavies
05/16/2022, 12:41 PMsimon.vergauwen
05/16/2022, 12:42 PMsimon.vergauwen
05/17/2022, 9:46 AMsimon.vergauwen
05/17/2022, 9:46 AMphldavies
05/17/2022, 11:44 AMsimon.vergauwen
05/17/2022, 2:00 PMphldavies
05/17/2022, 2:09 PM1.1.3-alpha.4.0+2022-05-17T09-11-10-723810Z
, is that intentional?