-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #947 from davegurnell/master
Syntax for ApplicativeError
- Loading branch information
Showing
5 changed files
with
105 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
package cats | ||
package syntax | ||
|
||
import cats.data.{Xor, XorT} | ||
|
||
trait ApplicativeErrorSyntax { | ||
implicit def applicativeErrorIdSyntax[E](e: E): ApplicativeErrorIdOps[E] = | ||
new ApplicativeErrorIdOps(e) | ||
|
||
implicit def applicativeErrorSyntax[F[_, _], E, A](fa: F[E, A])(implicit F: ApplicativeError[F[E, ?], E]): ApplicativeErrorOps[F[E, ?], E, A] = | ||
new ApplicativeErrorOps[F[E, ?], E, A](fa) | ||
} | ||
|
||
final class ApplicativeErrorIdOps[E](e: E) { | ||
def raiseError[F[_], A](implicit F: ApplicativeError[F, E]): F[A] = | ||
F.raiseError(e) | ||
} | ||
|
||
final class ApplicativeErrorOps[F[_], E, A](fa: F[A])(implicit F: ApplicativeError[F, E]) { | ||
def handleError(f: E => A): F[A] = | ||
F.handleError(fa)(f) | ||
|
||
def handleErrorWith(f: E => F[A]): F[A] = | ||
F.handleErrorWith(fa)(f) | ||
|
||
def attempt: F[E Xor A] = | ||
F.attempt(fa) | ||
|
||
def attemptT: XorT[F, E, A] = | ||
F.attemptT(fa) | ||
|
||
def recover(pf: PartialFunction[E, A]): F[A] = | ||
F.recover(fa)(pf) | ||
|
||
def recoverWith(pf: PartialFunction[E, F[A]]): F[A] = | ||
F.recoverWith(fa)(pf) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
41 changes: 41 additions & 0 deletions
41
tests/src/test/scala/cats/tests/ApplicativeErrorTests.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package cats | ||
package tests | ||
|
||
import cats.data.{Xor, XorT} | ||
|
||
class ApplicativeErrorCheck extends CatsSuite { | ||
|
||
type ErrorOr[A] = String Xor A | ||
|
||
val failed: String Xor Int = | ||
"Badness".raiseError[ErrorOr, Int] | ||
|
||
test("raiseError syntax creates an Xor with the correct type parameters") { | ||
failed should === ("Badness".left[Int]) | ||
} | ||
|
||
test("handleError syntax transforms an error to a success") { | ||
failed.handleError(error => error.length) should === (7.right) | ||
} | ||
|
||
test("handleErrorWith transforms an error to a success") { | ||
failed.handleErrorWith(error => error.length.right) should === (7.right) | ||
} | ||
|
||
test("attempt syntax creates a wrapped Xor") { | ||
failed.attempt should === ("Badness".left.right) | ||
} | ||
|
||
test("attemptT syntax creates an XorT") { | ||
failed.attemptT should === (XorT[ErrorOr, String, Int](failed.right)) | ||
} | ||
|
||
test("recover syntax transforms an error to a success") { | ||
failed.recover { case error => error.length } should === (7.right) | ||
} | ||
|
||
test("recoverWith transforms an error to a success") { | ||
failed.recoverWith { case error => error.length.right } should === (7.right) | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters