Skip to content

Commit e7ed4a7

Browse files
authored
Merge pull request #508 from danicheg/feither-leftMapOrKeepIn
Add `leftMapOrKeepIn` / `leftFlatMapOrKeepIn` to `F[Either[A,B]]` syntax
2 parents 43d5afd + 9d7b41a commit e7ed4a7

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

shared/src/main/scala/mouse/feither.scala

+14
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,14 @@ final class FEitherOps[F[_], L, R](private val felr: F[Either[L, R]]) extends An
8181
case r @ Right(_) => r.asInstanceOf[Right[A, B]]
8282
}
8383

84+
def leftFlatMapOrKeepIn[LL >: L, RR >: R](
85+
pf: PartialFunction[L, Either[LL, RR]]
86+
)(implicit F: Functor[F]): F[Either[LL, RR]] =
87+
F.map(felr) {
88+
case l @ Left(a) => pf.applyOrElse(a, (_: L) => l)
89+
case r: Right[L, R] => r.asInstanceOf[Right[LL, RR]]
90+
}
91+
8492
def leftFlatMapF[A, B >: R](f: L => F[Either[A, B]])(implicit F: Monad[F]): F[Either[A, B]] =
8593
F.flatMap(felr) {
8694
case Left(left) => f(left)
@@ -93,6 +101,12 @@ final class FEitherOps[F[_], L, R](private val felr: F[Either[L, R]]) extends An
93101
case r @ Right(_) => r.asInstanceOf[Right[A, R]]
94102
}
95103

104+
def leftMapOrKeepIn[LL >: L](pf: PartialFunction[L, LL])(implicit F: Functor[F]): F[Either[LL, R]] =
105+
F.map(felr) {
106+
case Left(a) => Left(pf.applyOrElse(a, identity[LL]))
107+
case r: Right[L, R] => r.asInstanceOf[Right[LL, R]]
108+
}
109+
96110
def leftAsIn[B](b: => B)(implicit F: Functor[F]): F[Either[B, R]] =
97111
leftMapIn(_ => b)
98112

shared/src/test/scala/mouse/FEitherSyntaxTest.scala

+13
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,13 @@ class FEitherSyntaxTest extends MouseSuite {
104104
assertEquals(leftValue.leftFlatMapIn(_ => "".asLeft[Int]), List("".asLeft[Int]))
105105
}
106106

107+
test("FEitherSyntax.leftFlatMapOrKeepIn") {
108+
assertEquals(rightValue.leftFlatMapOrKeepIn { case "42" => Left("") }, rightValue)
109+
assertEquals(leftValue.leftFlatMapOrKeepIn { case "4242" => Right(42) }, leftValue)
110+
assertEquals(leftValue.leftFlatMapOrKeepIn { case "42" => Left("") }, List(Left("")))
111+
assertEquals(leftValue.leftFlatMapOrKeepIn { case "42" => Right(42) }, rightValue)
112+
}
113+
107114
test("FEitherSyntax.leftFlatMapF") {
108115
assertEquals(rightValue.leftFlatMapF(_ => List("".asLeft[Int])), rightValue)
109116
assertEquals(leftValue.leftFlatMapF(_ => List("".asLeft[Int])), List("".asLeft[Int]))
@@ -114,6 +121,12 @@ class FEitherSyntaxTest extends MouseSuite {
114121
assertEquals(leftValue.leftMapIn(_ => ""), List("".asLeft[Int]))
115122
}
116123

124+
test("FEitherSyntax.leftMapOrKeepIn") {
125+
assertEquals(rightValue.leftMapOrKeepIn { case "42" => "" }, rightValue)
126+
assertEquals(leftValue.leftMapOrKeepIn { case "4242" => "" }, leftValue)
127+
assertEquals(leftValue.leftMapOrKeepIn { case "42" => "" }, List(Left("")))
128+
}
129+
117130
test("FEitherSyntax.leftAsIn") {
118131
assertEquals(rightValue.leftAsIn(""), rightValue)
119132
assertEquals(leftValue.leftAsIn(""), List("".asLeft[Int]))

0 commit comments

Comments
 (0)