Jess Brent
04/08/2020, 2:35 PMinline fun <reified T> withResult(
method: Result<T>,
onFailure: (errors: List<Throwable>) -> Unit
): T {
@Suppress("IMPLICIT_CAST_TO_ANY")
val methodResult = when (method) {
is Result.Success -> { method.t }
is Result.Failure -> { onFailure.invoke(method.errors) }
}
return methodResult as T
}
usage:
val r = withResult(method) { return Result.Failure(it) }
i can get this function to work on jvm, however it does not work on js. it results in a ClassCastException
the transpiled js appears to show that instead of invoking onFailure
it is only assigned to methodResult
.
also, this is a custom sealed class Result
not kotlin.Result
turansky
04/08/2020, 2:42 PMJess Brent
04/08/2020, 2:44 PMJess Brent
04/08/2020, 2:54 PMinline fun <reified T> withResult(method: Result<T>): Pair<T?, List<Throwable>> {
var result: T? = null
var errors: List<Throwable> = mutableListOf()
when (method) {
is Result.Success -> { result = method.t }
is Result.Failure -> { errors = method.errors }
}
return Pair(result, errors)
}
Rob Murdock
04/08/2020, 2:55 PMJess Brent
04/08/2020, 2:55 PManton.bannykh
04/08/2020, 2:56 PMinvoke
, i.e. is Result.Failure -> { onFailure(method.errors) }
?Jess Brent
04/08/2020, 2:57 PMJess Brent
04/08/2020, 2:58 PMRob Murdock
04/08/2020, 2:59 PMRob Murdock
04/08/2020, 2:59 PMRobert Jaros
04/08/2020, 3:00 PMonFailure
parameter declared as returning Unit
when you want to pass a lambda returning some kind of value?Rob Murdock
04/08/2020, 3:00 PManton.bannykh
04/08/2020, 3:03 PMinvoke
helps in a toy example: https://pl.kotl.in/iLjQkJkN8Rob Murdock
04/08/2020, 3:03 PMRobert Jaros
04/08/2020, 3:04 PMType inference failed. Expected type mismatch: inferred type is Result.Failure<...> but Unit was expected
Jess Brent
04/08/2020, 3:04 PMRob Murdock
04/08/2020, 3:04 PMJess Brent
04/08/2020, 3:04 PMResult.Failure
there but it did not change anything for meJess Brent
04/08/2020, 3:05 PM@Test
fun success() {
when(val result = testSuccess()) {
is Result.Success -> { assertEquals("success", result.t) }
is Result.Failure -> { asserter.fail("reeeeee") }
}
}
@Test
fun test_result_failure() {
when(val result = testFail()) {
is Result.Success -> { asserter.fail("reeee") }
is Result.Failure -> { assertEquals("fail", result.errors.first().message) }
}
}
private fun testFail(): Result<String> {
val s = withResult(test("failme")) { return Result.Failure(it) }
return Result.Success(s)
}
private fun testSuccess(): Result<String> {
val s = withResult(test("success")) { return Result.Failure(it) }
return Result.Success(s)
}
private fun test(string: String): Result<String> {
if (string == "failme") {
return Result.Failure(Error("fail"))
}
return Result.Success(string)
}
Rob Murdock
04/08/2020, 3:05 PMJess Brent
04/08/2020, 3:09 PMvar Result$Success = _.com.shift4.virgil.Result.Success;
var Result$Failure = _.com.shift4.virgil.Result.Failure;
var throwCCE = Kotlin.throwCCE;
return function (T_0, isT, method, onFailure) {
var tmp$, tmp$_0;
var result = method;
if (Kotlin.isType(result, Result$Success))
tmp$ = result.t;
else if (Kotlin.isType(result, Result$Failure))
tmp$ = onFailure(result.errors);
else
tmp$ = Kotlin.noWhenBranchMatched();
var methodResult = tmp$;
return isT(tmp$_0 = methodResult) ? tmp$_0 : throwCCE();
it will throw as Result.Failure
is not T
Rob Murdock
04/08/2020, 3:10 PMRob Murdock
04/08/2020, 3:11 PMRobert Jaros
04/08/2020, 3:12 PMval r = withResult<Any>(method) { return@withResult Result.Failure(it) }
Jess Brent
04/08/2020, 3:12 PMRobert Jaros
04/08/2020, 3:13 PMRob Murdock
04/08/2020, 3:14 PMJess Brent
04/08/2020, 3:15 PMAny
is not what we want here and would be required for that lambda to not throw CCEJess Brent
04/08/2020, 3:15 PM@withResult
is indeed not what we wantRob Murdock
04/08/2020, 3:16 PMJess Brent
04/08/2020, 3:17 PMRobert Jaros
04/08/2020, 3:19 PMRobert Jaros
04/08/2020, 3:20 PMfailure
on both JS and JVMRobert Jaros
04/08/2020, 3:20 PMsuccess
if i use return@withResult (on both JS and JVM)Jess Brent
04/08/2020, 3:20 PMString
though?Rob Murdock
04/08/2020, 3:23 PMRob Murdock
04/08/2020, 3:28 PManton.bannykh
04/08/2020, 3:30 PMinvoke
. Internally the compiler uses JS AST, augmented with additional stuff, so it is possible the behaviour will be different.
Here is basically your failing test, which works when there is no invoke
, but fails when there is one: https://pl.kotl.in/7VxOUywuiJess Brent
04/08/2020, 3:31 PMJess Brent
04/08/2020, 3:32 PMRobert Jaros
04/08/2020, 3:36 PManton.bannykh
04/08/2020, 3:36 PMRob Murdock
04/08/2020, 3:37 PMJess Brent
04/08/2020, 3:56 PManton.bannykh
04/08/2020, 3:56 PMJess Brent
04/08/2020, 3:57 PMJess Brent
04/08/2020, 4:05 PMJess Brent
04/08/2020, 4:05 PMJess Brent
04/08/2020, 4:07 PManton.bannykh
04/08/2020, 4:07 PMJess Brent
04/08/2020, 4:08 PManton.bannykh
04/08/2020, 4:08 PMJess Brent
04/08/2020, 4:33 PMJess Brent
04/08/2020, 4:42 PMreified
Jess Brent
04/08/2020, 4:42 PMJess Brent
04/08/2020, 4:43 PM