diff --git a/src/future/future.ts b/src/future/future.ts index e67137e..c56db3d 100644 --- a/src/future/future.ts +++ b/src/future/future.ts @@ -171,6 +171,10 @@ class Future { ); } + zip(that: Future): Future<[A, B]> { + return this.flatMap((value: A) => that.map((thatValue: B) => [value, thatValue] as [A, B])); + } + } export { Future }; diff --git a/test/future/future.ts b/test/future/future.ts index ee14491..a5f4e67 100644 --- a/test/future/future.ts +++ b/test/future/future.ts @@ -195,3 +195,14 @@ test('Future#recoverWith', async(t: ExecutionContext) => { await t.throws(failure.recoverWith((e: Error): Future => { throw error; }).promise); }); + +test('Future#zip', async(t: ExecutionContext) => { + t.plan(3); + + const value: Future = Future.create(10); + const successfulZip: [string, number] = await success.zip(value).promise; + t.deepEqual(successfulZip, ['hello', 10]); + + await t.throws(failure.zip(value).promise); + await t.throws(value.zip(failure).promise); +});