Skip to content

Instantly share code, notes, and snippets.

@Jacoby6000
Last active December 15, 2017 07:32
Show Gist options
  • Save Jacoby6000/201c93451cbd33d645bbd502fe11c97a to your computer and use it in GitHub Desktop.
Save Jacoby6000/201c93451cbd33d645bbd502fe11c97a to your computer and use it in GitHub Desktop.
class MoreMonadErrorOps[F[_], A](val fa: F[A]) extends AnyVal {
def liftEmpty[E](implicit FE: MonadError[F, E]): PartiallyAppliedLiftEmpty[F, A, E] =
new PartiallyAppliedLiftEmpty[F, A, E] {
override val fa: F[A] = fa
override val F: MonadError[F, E] = FE
}
}
trait PartiallyAppliedLiftEmpty[F[_], A, E] {
val fa: F[A]
implicit val F: MonadError[F, E]
def apply[B, X](raiseErr: => F[X])(implicit ev: A <~< Maybe[B], ev2: X <~< E): F[B] =
for {
a <- fa
maybe = ev(a)
result <- maybe.getOrElseF(raiseErr.flatMap(err => F.raiseError[B](ev2(err))))
} yield result
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment