diff --git a/src/main/java/com/ceticamarco/lambdatonic/Either.java b/src/main/java/com/ceticamarco/lambdatonic/Either.java
index b56a4d4..8fc8d52 100644
--- a/src/main/java/com/ceticamarco/lambdatonic/Either.java
+++ b/src/main/java/com/ceticamarco/lambdatonic/Either.java
@@ -70,7 +70,7 @@ public sealed interface Either permits Left, Right {
* Applies onLeft function to the Left subtype or the
* onRight function to the Right subtype.
*
- * @param onLeft The function to apply to the Left subtyp
+ * @param onLeft The function to apply to the Left subtype
* @param onRight The function to apply to the Right subtype
* @return An Either functor
* @param The return type of the onLeft function
@@ -109,4 +109,12 @@ public sealed interface Either permits Left, Right {
* @return An Optional data type
*/
Optional toOptional();
+
+ /**
+ *
+ * Flips the Left and the Right data types.
+ *
+ * @return An Either monad with Left and Right flipped
+ */
+ Either swap();
}
\ No newline at end of file
diff --git a/src/main/java/com/ceticamarco/lambdatonic/Left.java b/src/main/java/com/ceticamarco/lambdatonic/Left.java
index 5a57fe9..e9f89ac 100644
--- a/src/main/java/com/ceticamarco/lambdatonic/Left.java
+++ b/src/main/java/com/ceticamarco/lambdatonic/Left.java
@@ -52,4 +52,9 @@ public record Left(L value) implements Either {
public Optional toOptional() {
return Optional.empty();
}
+
+ @Override
+ public Either swap() {
+ return new Right<>(this.value);
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/ceticamarco/lambdatonic/Right.java b/src/main/java/com/ceticamarco/lambdatonic/Right.java
index 828969b..d4b8cdd 100644
--- a/src/main/java/com/ceticamarco/lambdatonic/Right.java
+++ b/src/main/java/com/ceticamarco/lambdatonic/Right.java
@@ -52,4 +52,9 @@ public record Right(R value) implements Either {
public Optional toOptional() {
return Optional.of(this.value);
}
+
+ @Override
+ public Either swap() {
+ return new Left<>(this.value);
+ }
}
\ No newline at end of file
diff --git a/src/test/java/com/ceticamarco/lambdatonic/LeftTests.java b/src/test/java/com/ceticamarco/lambdatonic/LeftTests.java
index 95994c8..cb10c01 100644
--- a/src/test/java/com/ceticamarco/lambdatonic/LeftTests.java
+++ b/src/test/java/com/ceticamarco/lambdatonic/LeftTests.java
@@ -103,4 +103,12 @@ public class LeftTests {
Optional.empty()
);
}
+
+ @Test
+ public void testSwapFromLeft() {
+ assertEquals(
+ this.resEither.swap(),
+ new Right<>(19)
+ );
+ }
}
diff --git a/src/test/java/com/ceticamarco/lambdatonic/RightTests.java b/src/test/java/com/ceticamarco/lambdatonic/RightTests.java
index daebfca..0076f80 100644
--- a/src/test/java/com/ceticamarco/lambdatonic/RightTests.java
+++ b/src/test/java/com/ceticamarco/lambdatonic/RightTests.java
@@ -103,4 +103,12 @@ public class RightTests {
Optional.of(4)
);
}
+
+ @Test
+ public void testSwapFromRight() {
+ assertEquals(
+ this.numEither.swap(),
+ new Left<>(4)
+ );
+ }
}