+
+ implicit val ParserFunctor = new Functor[Parser] {
+ def map[A, B](m: Parser[A])(f: A => B) = new Parser[B] {
+ def runParser[F[_], R](kf: Failure[F, R], ks: Success[B, F, R]): F[R] = {
+ def ks_(a: A) = ks(f(a))
+ return m.runParser(kf, ks_)
+ }
+ }
+ }
+
+ implicit val ParserApplicative = new Applicative[Parser] {
+ def point[A](a: => A) = new Parser[A] {
+ def runParser[F[_], R](kf: Failure[F, R], ks: Success[A, F, R]): F[R]
+ = ks(a)
+ }
+ def ap[A, B](m: => Parser[A])(fm: => Parser[A => B]) = new Parser[B] {
+ def runParser[F[_], R](kf: Failure[F, R], ks: Success[B, F, R]): F[R] = {
+ def ks_(f: A => B): F[R] = {
+ def ks__(a: A) = ks(f(a))
+ return m.runParser(kf, ks__)
+ }
+ return fm.runParser(kf, ks_)
+ }
+ }
+ }
+
+ implicit val ParserMonad = new Monad[Parser] {
+ def point[A](a: => A) = a.point[Parser]
+
+ def bind[A, B](m: Parser[A])(f: A => Parser[B]) = new Parser[B] {
+ def runParser[F[_], R](kf: Failure[F, R], ks: Success[B, F, R]): F[R] = {
+ def ks_(a: A) = f(a).runParser(kf, ks)
+ return m.runParser(kf, ks_)
+ }
+ }
+ }
+
+ implicit val ParserMonadError = new MonadError[({type λ[String, α] = Parser[α]})#λ, String] {
+ def point[A](a: => A) = a.point[Parser]
+ def bind[A, B](m: Parser[A])(f: A => Parser[B]) = m.flatMap(f)
+
+ def handleError[A](m: Parser[A])(f: String => Parser[A]) = new Parser[A] {
+ def runParser[F[_], R](kf: Failure[F, R], ks: Success[A, F, R]): F[R] = {
+ def kf_(e: String) = f(e).runParser(kf, ks)
+ return m.runParser(kf_, ks)
+ }
+ }
+
+ def raiseError[A](e: String) = new Parser[A] {
+ def runParser[F[_], R](kf: Failure[F, R], ks: Success[A, F, R]): F[R]
+ = kf(e)
+ }
+ }
+
+ implicit def ToMonadErrorOps[A](m: Parser[A]) = new {
+ def handleError(f: String => Parser[A]): Parser[A]
+ = implicitly[MonadError[({type λ[String, α] = Parser[α]})#λ, String]].handleError(m)(f)
+ }
+
+ implicit def ToMonadErrorIdOps(e: String) = new {
+ def raiseError[A]: Parser[A]
+ = implicitly[MonadError[({type λ[String, α] = Parser[α]})#λ, String]].raiseError(e)
+ }
+