Если у тебя есть тупл (I => F[A], I => F[B], ... I => F[X])
Тебе тут надо сделать две операции:
- дистрибьют функций
- парТуплд
для дистрибьюта нет N-арных перегрузок как для .tupled/.mapN
Поэтому придется либо писать генерилку, либо делать руками.
val fn: I => F[(A, B)] = i => (fa(i), fb(i)).parTupled
Если бы был список, а не тупл, то было бы что-то типа
ff.cosequence.map(_.parSequence)