Я ищу элегантный способ составления последовательности функций, которые возвращают Future
. Т.е. для последовательности (f1, f2, ..., f_n)
, каждая функция имеет тип T=>Future[T]
, я хочу создать новую функцию g
, где g(x) = f_n(...f2(f1(x))...)
.
Моя реализация выглядит следующим образом:
def doInOrder[T] (fs : (T => Future[T])*)(implicit ec:ExecutionContext): T=>Future[T] = {
(t:T) => {
fs.reduceLeft((future1: T=>Future[T], future2: T=>Future[T]) =>
(arg:T) => future1(arg).flatMap((arg2:T) => future2(arg2))
)(t)
}
}
Насколько я могу судить, это работает. Решение кажется немного запутанным, хотя с несколькими вложенными лямбдами. Можно ли это упростить?
Проблема взята из книги Хорстманна Скала для нетерпеливого , в которой просит
Написать функциюdoInOrder
, что, учитывая две функции f: T =>
Future[U]
и g: U
=> Future[V]
, производит функцию T => Future[U]
, которая для данного t в конечном итоге приводит к g(f(t))
, а затем к:
Повторите предыдущее упражнение для любой последовательности функций типа T
=> Future[T]
.