From 206e03c757bfeea0594a9a9ceb379f67fef97e4e Mon Sep 17 00:00:00 2001 From: PHO Date: Fri, 10 Oct 2014 17:21:10 +0900 Subject: [PATCH] MonadError --- .../scala/jp/ymir/taskReporter/core/TSV.scala | 64 ++++++++++++------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/src/main/scala/jp/ymir/taskReporter/core/TSV.scala b/src/main/scala/jp/ymir/taskReporter/core/TSV.scala index fc4947d..541104f 100644 --- a/src/main/scala/jp/ymir/taskReporter/core/TSV.scala +++ b/src/main/scala/jp/ymir/taskReporter/core/TSV.scala @@ -10,30 +10,30 @@ object TSV { type Record = Map[Symbol, Field] // --- - type Failure[ F[_], R] = String => F[R] - type Success[A, F[_], R] = A => F[R] + type Failure[ F[_, _], E, R] = E => F[E, R] + type Success[A, F[_, _], E, R] = A => F[E, R] - trait Parser[A] { - def runParser[F[_], R](kf: Failure[F, R], ks: Success[A, F, R]): F[R] + trait Parser[E, A] { + def runParser[F[_, _], R](kf: Failure[F, E, R], ks: Success[A, F, E, R]): F[E, R] } - implicit def 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] = { + implicit def ParserFunctor[E] = new Functor[({type λ[α] = Parser[E, α]})#λ] { + def map[A, B](m: Parser[E, A])(f: A => B) = new Parser[E, B] { + def runParser[F[_, _], R](kf: Failure[F, E, R], ks: Success[B, F, E, R]): F[E, R] = { def ks_(a: A) = ks(f(a)) return m.runParser(kf, ks_) } } } - implicit def 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) + implicit def ParserApplicative[E] = new Applicative[({type λ[α] = Parser[E, α]})#λ] { + def point[A](a: => A) = new Parser[E, A] { + def runParser[F[_, _], R](kf: Failure[F, E, R], ks: Success[A, F, E, R]): F[E, 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 ap[A, B](m: => Parser[E, A])(fm: => Parser[E, A => B]) = new Parser[E, B] { + def runParser[F[_, _], R](kf: Failure[F, E, R], ks: Success[B, F, E, R]): F[E, R] = { + def ks_(f: A => B): F[E, R] = { def ks__(a: A) = ks(f(a)) return m.runParser(kf, ks__) } @@ -42,21 +42,41 @@ object TSV { } } - implicit def ParserMonad = new Monad[Parser] { - def point[A](a: => A) = implicitly[Applicative[Parser]].point(a) + implicit def ParserMonad[E] = new Monad[({type λ[α] = Parser[E, α]})#λ] { + def point[A](a: => A) + = implicitly[Applicative[({type λ[α] = Parser[E, α]})#λ]].point(a) - 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 bind[A, B](m: Parser[E, A])(f: A => Parser[E, B]) = new Parser[E, B] { + def runParser[F[_, _], R](kf: Failure[F, E, R], ks: Success[B, F, E, R]): F[E, R] = { def ks_(a: A) = f(a).runParser(kf, ks) return m.runParser(kf, ks_) } } } - def runParser[A](p: Parser[A]): Either[String, A] = { - type F[A] = Either[String, A] - def left (errMsg: String): F[A] = Left(errMsg) - def right(x : A ): F[A] = Right(x) + implicit def ParserMonadError[E] = new MonadError[Parser, E] { + def point[A](a: => A) + = implicitly[Applicative[({type λ[α] = Parser[E, α]})#λ]].point(a) + + def bind[A, B](m: Parser[E, A])(f: A => Parser[E, B]) + = implicitly[Monad[({type λ[α] = Parser[E, α]})#λ]].bind(m)(f) + + def handleError[A](m: Parser[E, A])(f: E => Parser[E, A]) = new Parser[E, A] { + def runParser[F[_, _], R](kf: Failure[F, E, R], ks: Success[A, F, E, R]): F[E, R] = { + def kf_(e: E) = f(e).runParser(kf, ks) + return m.runParser(kf_, ks) + } + } + + def raiseError[A](e: E) = new Parser[E, A] { + def runParser[F[_, _], R](kf: Failure[F, E, R], ks: Success[A, F, E, R]): F[E, R] + = kf(e) + } + } + + def runParser[E, A](p: Parser[E, A]): Either[E, A] = { + def left (e: E): Either[E, A] = Left(e) + def right(x: A): Either[E, A] = Right(x) return p.runParser(left, right) } // --- -- 2.40.0