From b7532f3c03b401bd5feed57305bb182a29f00b97 Mon Sep 17 00:00:00 2001 From: Matthias Berndt Date: Fri, 7 Sep 2018 23:03:04 +0200 Subject: [PATCH 1/4] improve interaction with subtyping in OptionOps#liftTo --- core/src/main/scala/cats/ApplicativeError.scala | 2 +- core/src/main/scala/cats/syntax/option.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/scala/cats/ApplicativeError.scala b/core/src/main/scala/cats/ApplicativeError.scala index b289782ff8..5b0dc72b08 100644 --- a/core/src/main/scala/cats/ApplicativeError.scala +++ b/core/src/main/scala/cats/ApplicativeError.scala @@ -187,7 +187,7 @@ object ApplicativeError { def apply[F[_], E](implicit F: ApplicativeError[F, E]): ApplicativeError[F, E] = F private[cats] final class LiftFromOptionPartially[F[_]](val dummy: Boolean = true) extends AnyVal { - def apply[E, A](oa: Option[A], ifEmpty: => E)(implicit F: ApplicativeError[F, E]): F[A] = + def apply[E, A](oa: Option[A], ifEmpty: => E)(implicit F: ApplicativeError[F, _ >: E]): F[A] = oa match { case Some(a) => F.pure(a) case None => F.raiseError(ifEmpty) diff --git a/core/src/main/scala/cats/syntax/option.scala b/core/src/main/scala/cats/syntax/option.scala index 0052aa6cbc..299653580c 100644 --- a/core/src/main/scala/cats/syntax/option.scala +++ b/core/src/main/scala/cats/syntax/option.scala @@ -203,7 +203,7 @@ final class OptionOps[A](val oa: Option[A]) extends AnyVal { object OptionOps { private[syntax] final class LiftToPartiallyApplied[F[_], A](oa: Option[A]) { - def apply[E](ifEmpty: => E)(implicit F: ApplicativeError[F, E]): F[A] = + def apply[E](ifEmpty: => E)(implicit F: ApplicativeError[F, _ >: E]): F[A] = ApplicativeError.liftFromOption(oa, ifEmpty) } } From fc6b2db4b78db73565cb7f25f69c07476b283c55 Mon Sep 17 00:00:00 2001 From: Matthias Berndt Date: Sat, 8 Sep 2018 13:57:27 +0200 Subject: [PATCH 2/4] improve interaction with subtyping in EitherOps#liftTo --- core/src/main/scala/cats/syntax/either.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/scala/cats/syntax/either.scala b/core/src/main/scala/cats/syntax/either.scala index 78fcfc7863..5eb9ae678b 100644 --- a/core/src/main/scala/cats/syntax/either.scala +++ b/core/src/main/scala/cats/syntax/either.scala @@ -281,7 +281,7 @@ final class EitherOps[A, B](val eab: Either[A, B]) extends AnyVal { * res0: cats.data.EitherT[Option, String, Int] = EitherT(Some(Right(3))) * }}} */ - def liftTo[F[_]](implicit F: ApplicativeError[F, A]): F[B] = F.fromEither(eab) + def liftTo[F[_]](implicit F: ApplicativeError[F, _ >: A]): F[B] = F.fromEither(eab) } From 9500d484ab127cc32357248505240a2b8de05d20 Mon Sep 17 00:00:00 2001 From: Matthias Berndt Date: Sat, 8 Sep 2018 14:51:08 +0200 Subject: [PATCH 3/4] add some doctests for OptionOps#liftTo and EitherOps#liftTo --- core/src/main/scala/cats/syntax/either.scala | 4 ++-- core/src/main/scala/cats/syntax/option.scala | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/src/main/scala/cats/syntax/either.scala b/core/src/main/scala/cats/syntax/either.scala index 5eb9ae678b..a59676ac5b 100644 --- a/core/src/main/scala/cats/syntax/either.scala +++ b/core/src/main/scala/cats/syntax/either.scala @@ -277,8 +277,8 @@ final class EitherOps[A, B](val eab: Either[A, B]) extends AnyVal { * scala> import cats.implicits._ * scala> import cats.data.EitherT * scala> val e: Either[String, Int] = Right(3) - * scala> e.liftTo[EitherT[Option, String, ?]] - * res0: cats.data.EitherT[Option, String, Int] = EitherT(Some(Right(3))) + * scala> e.liftTo[EitherT[Option, CharSequence, ?]] + * res0: cats.data.EitherT[Option, CharSequence, Int] = EitherT(Some(Right(3))) * }}} */ def liftTo[F[_]](implicit F: ApplicativeError[F, _ >: A]): F[B] = F.fromEither(eab) diff --git a/core/src/main/scala/cats/syntax/option.scala b/core/src/main/scala/cats/syntax/option.scala index 299653580c..69090dc3ef 100644 --- a/core/src/main/scala/cats/syntax/option.scala +++ b/core/src/main/scala/cats/syntax/option.scala @@ -178,12 +178,14 @@ final class OptionOps[A](val oa: Option[A]) extends AnyVal { * Example: * {{{ * scala> import cats.implicits._ - * + * scala> import cats.data.EitherT * scala> Some(1).liftTo[Either[String, ?]]("Empty") * res0: scala.Either[String, Int] = Right(1) * * scala> Option.empty[Int].liftTo[Either[String, ?]]("Empty") * res1: scala.Either[String, Int] = Left(Empty) + * scala> 42.some.liftTo[EitherT[Option, CharSequence, ?]]("Empty") + * res2: EitherT[Option, CharSequence, Int] = EitherT(Some(Right(42))) * }}} */ def liftTo[F[_]]: LiftToPartiallyApplied[F, A] = new LiftToPartiallyApplied(oa) From 53f7cbb400393efb713aca6a2c5682c32e73b981 Mon Sep 17 00:00:00 2001 From: Matthias Berndt Date: Sat, 8 Sep 2018 16:17:50 +0200 Subject: [PATCH 4/4] simplify test for OptionOps#liftTo --- core/src/main/scala/cats/syntax/option.scala | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/core/src/main/scala/cats/syntax/option.scala b/core/src/main/scala/cats/syntax/option.scala index 69090dc3ef..155fee3686 100644 --- a/core/src/main/scala/cats/syntax/option.scala +++ b/core/src/main/scala/cats/syntax/option.scala @@ -178,14 +178,11 @@ final class OptionOps[A](val oa: Option[A]) extends AnyVal { * Example: * {{{ * scala> import cats.implicits._ - * scala> import cats.data.EitherT - * scala> Some(1).liftTo[Either[String, ?]]("Empty") - * res0: scala.Either[String, Int] = Right(1) + * scala> Some(1).liftTo[Either[CharSequence, ?]]("Empty") + * res0: scala.Either[CharSequence, Int] = Right(1) * - * scala> Option.empty[Int].liftTo[Either[String, ?]]("Empty") - * res1: scala.Either[String, Int] = Left(Empty) - * scala> 42.some.liftTo[EitherT[Option, CharSequence, ?]]("Empty") - * res2: EitherT[Option, CharSequence, Int] = EitherT(Some(Right(42))) + * scala> Option.empty[Int].liftTo[Either[CharSequence, ?]]("Empty") + * res1: scala.Either[CharSequence, Int] = Left(Empty) * }}} */ def liftTo[F[_]]: LiftToPartiallyApplied[F, A] = new LiftToPartiallyApplied(oa)