]> gitweb @ CieloNegro.org - task-reporter.git/commitdiff
MonadError
authorPHO <pho@cielonegro.org>
Fri, 10 Oct 2014 08:21:10 +0000 (17:21 +0900)
committerPHO <pho@cielonegro.org>
Fri, 10 Oct 2014 08:21:10 +0000 (17:21 +0900)
src/main/scala/jp/ymir/taskReporter/core/TSV.scala

index fc4947d766cecc33a2601d4cebd6a2b6cb97056c..541104f8ae3a037bd53501d85c52a4efe664756c 100644 (file)
@@ -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)
   }
   // ---