Для этого функции просто не подходят.Я бы объявил тип, значения которого соответствуют методам S
, поэтому
class S {
fun method1(x: String): S = ...
fun method2(): S = ...
...
sealed class Transform {
operator fun invoke(s: S): S = when(this) {
is Method1 -> s.method1(x)
is Method2 -> s.method2()
...
}
class Method1(val x: String) : Transform
object Method2 : Transform
}
}
fun emit(reduction: S.Transform) {
state = reduction.invoke(state)
if (_uiState.value != state) {
_uiState.postValue(state)
}
}
С некоторым усилием Transform
может быть сгенерировано автоматически (например, с использованием процессора аннотаций, как вы упомянули вкомментарий), но это может не стоить того, в зависимости от того, сколько классов и методов вам нужно обработать и как часто они меняются.