Использование бесформенного для преобразования кортежа будущего в будущее кортежа с помощью HList
Есть ли простой способ конвертировать кортеж типа (Future [A], Future [B], Future [C], ..., Future [N]) в Future [(A, B, C, ..., N)]? Это предполагает неопределенное количество элементов в кортеже.
Я попытался преобразовать кортеж в HList и попробовал аналогичную уловку foldLeft и для понимания, как это было сделано в Future.sequence, но мне не повезло в работе с типами, передаваемыми в складку. Пробовал то же самое с рекурсивными функциями. Но этот код по-прежнему не компилируется из-за отсутствия HList.head, HList.tail. Код выглядит следующим образом:
def sequence[L <: HList](in: L)(implicit ihc: IsHCons[L]) = {
val list = for (i <- in.head; j <- in.tail.head) yield HList(i, j)
@tailrec
def sequence2(fList: Future[HList], listF: HList): Future[HList] = {
if (listF == HNil) fList
else {
val nextFList = for (l <- fList; e <- listF.head.asInstanceOf[Future[_]]) yield l :+ e
sequence2(nextFList, listF.tail)
}
}
sequence2(list, in.tail.tail)
}
Этот код должен возвращать Future [HList], который мы затем можем отобразить в кортеж с помощью функции tupled. В идеале нам нужно проверить, есть ли в кортеже менее 3 элементов. Но давайте предположим, что для этого упражнения вводится HList размером 3 или больше.
Я на Shapeless 1.2.4 и пока не могу двигаться из-за других зависимостей.
Заранее спасибо!