Rename SuccessOrFailure to Result and hide Failure from ABI
* The members of Result are isSuccess, isFailure, exceptionOrNull, getOrNull * The rest of API is implemented via inline-only extensions * There are two internal functions to hide detailed mechanics of an internal Result.Failure class: createFailure and throwOnFailure * Result.toString is explicit: either Success(v) or Failure(x) See KT-26538
This commit is contained in:
+8
-8
@@ -1,29 +1,29 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
inline class SuccessOrFailure<T>(val a: Any?) {
|
||||
inline class Result<T>(val a: Any?) {
|
||||
fun getOrThrow(): T = a as T
|
||||
}
|
||||
|
||||
abstract class SuccessOrFailureReceiver<T> {
|
||||
abstract fun receive(result: SuccessOrFailure<T>)
|
||||
abstract class ResultReceiver<T> {
|
||||
abstract fun receive(result: Result<T>)
|
||||
}
|
||||
|
||||
fun <T> SuccessOrFailureReceiver(f: (SuccessOrFailure<T>) -> Unit): SuccessOrFailureReceiver<T> =
|
||||
object : SuccessOrFailureReceiver<T>() {
|
||||
override fun receive(result: SuccessOrFailure<T>) {
|
||||
fun <T> ResultReceiver(f: (Result<T>) -> Unit): ResultReceiver<T> =
|
||||
object : ResultReceiver<T>() {
|
||||
override fun receive(result: Result<T>) {
|
||||
f(result)
|
||||
}
|
||||
}
|
||||
|
||||
fun test() {
|
||||
var invoked = false
|
||||
val receiver = SuccessOrFailureReceiver<Int> { result ->
|
||||
val receiver = ResultReceiver<Int> { result ->
|
||||
val intResult = result.getOrThrow()
|
||||
invoked = true
|
||||
}
|
||||
|
||||
receiver.receive(SuccessOrFailure(42))
|
||||
receiver.receive(Result(42))
|
||||
if (!invoked) {
|
||||
throw RuntimeException("Fail")
|
||||
}
|
||||
|
||||
+8
-8
@@ -1,29 +1,29 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
inline class SuccessOrFailure<T>(val a: Any?) {
|
||||
inline class Result<T>(val a: Any?) {
|
||||
fun getOrThrow(): T = a as T
|
||||
}
|
||||
|
||||
abstract class SuccessOrFailureReceiver<T> {
|
||||
abstract fun receive(result: SuccessOrFailure<T>)
|
||||
abstract class ResultReceiver<T> {
|
||||
abstract fun receive(result: Result<T>)
|
||||
}
|
||||
|
||||
inline fun <T> SuccessOrFailureReceiver(crossinline f: (SuccessOrFailure<T>) -> Unit): SuccessOrFailureReceiver<T> =
|
||||
object : SuccessOrFailureReceiver<T>() {
|
||||
override fun receive(result: SuccessOrFailure<T>) {
|
||||
inline fun <T> ResultReceiver(crossinline f: (Result<T>) -> Unit): ResultReceiver<T> =
|
||||
object : ResultReceiver<T>() {
|
||||
override fun receive(result: Result<T>) {
|
||||
f(result)
|
||||
}
|
||||
}
|
||||
|
||||
fun test() {
|
||||
var invoked = false
|
||||
val receiver = SuccessOrFailureReceiver<String> { result ->
|
||||
val receiver = ResultReceiver<String> { result ->
|
||||
val intResult = result.getOrThrow()
|
||||
invoked = true
|
||||
}
|
||||
|
||||
receiver.receive(SuccessOrFailure("42"))
|
||||
receiver.receive(Result("42"))
|
||||
if (!invoked) {
|
||||
throw RuntimeException("Fail")
|
||||
}
|
||||
|
||||
+8
-8
@@ -1,15 +1,15 @@
|
||||
// !LANGUAGE: +InlineClasses
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
inline class SuccessOrFailure<out T>(val value: Any?) {
|
||||
inline class Result<out T>(val value: Any?) {
|
||||
val isFailure: Boolean get() = value is Failure
|
||||
|
||||
public companion object {
|
||||
public inline fun <T> success(value: T): SuccessOrFailure<T> =
|
||||
SuccessOrFailure(value)
|
||||
public inline fun <T> success(value: T): Result<T> =
|
||||
Result(value)
|
||||
|
||||
public inline fun <T> failure(exception: Throwable): SuccessOrFailure<T> =
|
||||
SuccessOrFailure(Failure(exception))
|
||||
public inline fun <T> failure(exception: Throwable): Result<T> =
|
||||
Result(Failure(exception))
|
||||
}
|
||||
|
||||
class Failure (
|
||||
@@ -17,11 +17,11 @@ inline class SuccessOrFailure<out T>(val value: Any?) {
|
||||
)
|
||||
}
|
||||
|
||||
inline fun <R> runCatching(block: () -> R): SuccessOrFailure<R> {
|
||||
inline fun <R> runCatching(block: () -> R): Result<R> {
|
||||
return try {
|
||||
SuccessOrFailure.success(block())
|
||||
Result.success(block())
|
||||
} catch (e: Throwable) {
|
||||
SuccessOrFailure.failure(e)
|
||||
Result.failure(e)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user