<T>.replaceIf(condition: Boolean, mapper: (T) -> T): T = if (condition) mapper(this) else this
Я захотел её каррировать, чтобы сначала передать предикат (а не уже вычисленный результат в виде Boolean), а потом вызывать маппер. Получилось следующее:
fun <T> T.replaceIf(predicate: (T) -> Boolean): ((T) -> T) -> T = { mapper: (T) -> T -> replaceIf(predicate(this)) { mutator(this) } }
Вопрос следующий - я так понимаю, красиво вызвать это теперь в одну строчку, опуская круглые скобки, уже не получится? Компилятор съедает только следующее:
someValue.replaceIf { somePredicate(it) } ({ it.someModification() })
Т.е. несмотря на то, что мне возвращается функция, принимающая единственный аргумент, другую функцию, я не могу сразу вызвать её, опустив круглые скобки? Хотелось бы чего-нибудь типа:
someValue.replaceIf { somePredicate(it) } { it.someModification() }
Вот такое ещё разве что завелось: 5.replaceIf { true } () { it * 2 } А вообще нельзя, да — передать таким образом можно ровно одну лямбду, и две подряд даже с каррированием всё равно являются синтаксической ошибкой. По мне это хорошо, ибо читать такое было бы не особо просто.
Обсуждают сегодня