arrow-kt / arrow

Λrrow - Functional companion to Kotlin's Standard Library
http://arrow-kt.io
Other
6.13k stars 442 forks source link

["Request"] Annotate Raise interface with @RaiseDSL #3415

Closed pema4 closed 4 months ago

pema4 commented 4 months ago

What version are you currently using? 1.2.4

What would you like to see?

According to DslMarker documentation, DSL marker is used to annotate interfaces/classes to limit visibility of their members in cases when there are multiple annotated receivers in scope. But currently in Arrow @RaiseDSL annotation is not present on the Raise interface, only on its methods and extensions. Consequently, this code compiles and runs:

import arrow.core.raise.*

fun main() {
    either<Int, Int> {
        withError<Int, String, _>(String::length) {
            raise("23423") // correctly resolves to this@withError.raise
            raise(42) // error type does not match inner Raise, but the call still resolves to this@either.raise
        }
    }.also(::println)
    // prints Either.Left(5)
}
kyay10 commented 4 months ago

This is intentional behaviour. We want you to be able to set up multiple Raise instances, and be able to raise to any of them easily. This allows for easy error handling for multiple types

serras commented 4 months ago

As mentioned by @kyay10, this is by design. Especially in accumulate environments, we want to still give the option to call the outer raise, to signal that accumulation has to stop.