Let's suppose, you have something with type F[Either[T, T]] and you want to flatten Either under your F because both of Either types have the same type and the value doesn't matter for your program.
I found just using Either.fold and use identity function twice for both sides but I think there is should be the better way to do this.
import cats.Functor
import cats.syntax.functor._
import scala.concurrent.Await
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
import scala.concurrent.duration.DurationInt
import scala.language.higherKinds
def foo[F[_]: Functor, T](eitherF: F[Either[T, T]]): F[T] =
eitherF.map(either => either.fold(identity, identity))
val flattenProcess = foo[Future, String](Future(Left[String, String]("left")))
.flatMap{
prev =>
println(prev)
foo[Future, String](Future(Right[String, String]("rigth")))
}
println(Await.result(flattenProcess, 10.seconds))
// prints:
// left
// rigth
here I use Future just for example of some wrapped effect.
Does scala std lib or maybe cats library has something to make it more elegant?
Or maybe it is just a problem of my bad design of using Either?
CodePudding user response:
Try Either#merge
eitherF.map(_.merge)
which converts Either[T, T] to T.
