pablisco
04/23/2021, 9:32 AMgenerateSequence
however it doesn’t support suspend operations 🙃
Anyone knows of an alternative for such case?Alex Vasilkov
04/23/2021, 9:44 AMsuspend fun call(): Result {
val res1 = call1()
val res2 = call2(res1)
val res3 = call3(res2)
return res3
}
?pablisco
04/23/2021, 9:45 AMAlex Vasilkov
04/23/2021, 9:45 AMpablisco
04/23/2021, 9:45 AMAlex Vasilkov
04/23/2021, 9:55 AMpablisco
04/23/2021, 9:57 AMtailrec suspend fun call(
result: List<String> = emtpyList(),
lastItem: String? = null
): List<String> = fetch(lastItem).let { new ->
when {
new.isEmpty() -> result
else -> call(result + new, new.lastOrNull())
}
}
I’m not sure why local mutable variables are necessary an evilNobody said it’s evil, JUST what I want to do
Alex Vasilkov
04/23/2021, 10:03 AMsomething like: …It seems like this code does not use tailrec because of
.let
call. With fixed tailrec Kotlin generates something like this:
@NotNull
public static final List call(@NotNull List result, @Nullable String lastItem) {
while(true) {
Intrinsics.checkNotNullParameter(result, "result");
List var2 = fetch(lastItem);
if (var2.isEmpty()) {
return result;
}
List var10000 = CollectionsKt.plus((Collection)result, (Iterable)var2);
lastItem = (String)CollectionsKt.lastOrNull(var2);
result = var10000;
}
}
So it still uses a mutable result
variable after all.pablisco
04/23/2021, 10:03 AMSo it still uses a mutableLet’s usevariable after all.result
List<Any>
too, right? 😂tailrec suspend fun call(
result: List<String> = emptyList(),
lastItem: String? = null
): List<String> {
val new = fetch(lastItem)
return when {
new.isEmpty() -> result
else -> call(result + new, new.lastOrNull())
}
}
louiscad
04/23/2021, 10:18 AMpablisco
04/23/2021, 10:24 AM