liftN
const getTimeFromStart = startTime => Date.now() - startTime;
const makeFuture = startTime => ms => Future((reject, resolve) => {
console.log('start: ' + ms, 'timeFromStart: ' + getTimeFromStart(startTime));
return setTimeout(() => {
console.log('finish: ' + ms, 'timeFromStart: ' + getTimeFromStart(startTime));
resolve(ms);
}, ms)
});
const futureOfMs = makeFuture(Date.now());
const madd3 = R.liftN(3, (...args) => args);
const futuRes = madd3(futureOfMs(1000), futureOfMs(5000), futureOfMs(3000));
futuRes.fork(err => console.error(err), data => console.log(data)); //=>
// start: 1000
// timeFromStart: 0
// start: 5000
// timeFromStart: 0
// start: 3000
// timeFromStart: 0
// finish: 1000
// timeFromStart: 1002
// finish: 3000
// timeFromStart: 3002
// finish: 5000
// timeFromStart: 5002
// [1000,5000,3000]
// So, method starts all the futures simultaneously, and calculates result only when the last one is finished.
// It returns results according to the preassigned order.