From ee3c942c9d3b4964793b473dd5afcca9e3079283 Mon Sep 17 00:00:00 2001 From: Dri3xCz Date: Mon, 16 Feb 2026 23:35:14 +0100 Subject: [PATCH] feat: zip method on Either to "zip" two eithers into a tuple, right-biased --- lib/src/either.dart | 2 ++ test/either_test.dart | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/lib/src/either.dart b/lib/src/either.dart index 2ee5b58..9d07a3e 100644 --- a/lib/src/either.dart +++ b/lib/src/either.dart @@ -139,6 +139,8 @@ abstract class Either implements TraversableMonadOps, R @override Either> zipWithIndex() => map((r) => tuple2(0, r)); + Either> zip(Either eitherB) => flatMap((a) => eitherB.map((b) => tuple2(a, b))); + @override bool all(bool f(R r)) => map(f)|true; @override bool every(bool f(R r)) => all(f); diff --git a/test/either_test.dart b/test/either_test.dart index 6461710..b1f7c5f 100644 --- a/test/either_test.dart +++ b/test/either_test.dart @@ -103,4 +103,18 @@ void main() { expect(right.value, 2); }); }); + + group("zip", () { + test('value', () { + final r1 = right(1); + final r2 = right(2); + final l1 = left("foo"); + final l2 = left("bar"); + + expect(r1.zip(r2), right(tuple2(1, 2))); + expect(r1.zip(l1), left("foo")); + expect(r1.zip(l2), left("bar")); + expect(l1.zip(r2), left("foo")); + }); + }); }