1 package jp.ymir.taskReporter.core
2 import scala.collection._
3 import scala.collection.immutable.StringLike
4 import scala.language.higherKinds
5 import scala.language.implicitConversions
6 import scala.language.reflectiveCalls
11 type Header = Seq[Symbol]
13 type Record = Map[Symbol, Field]
16 type Failure[ F[_], R] = String => F[R]
17 type Success[A, F[_], R] = A => F[R]
20 def runParser[F[_], R](kf: Failure[F, R], ks: Success[A, F, R]): F[R]
23 implicit def ParserFunctor = new Functor[Parser] {
24 def map[A, B](m: Parser[A])(f: A => B) = new Parser[B] {
25 def runParser[F[_], R](kf: Failure[F, R], ks: Success[B, F, R]): F[R] = {
26 def ks_(a: A) = ks(f(a))
27 return m.runParser(kf, ks_)
32 implicit def ParserApplicative = new Applicative[Parser] {
33 def point[A](a: => A) = new Parser[A] {
34 def runParser[F[_], R](kf: Failure[F, R], ks: Success[A, F, R]): F[R]
37 def ap[A, B](m: => Parser[A])(fm: => Parser[A => B]) = new Parser[B] {
38 def runParser[F[_], R](kf: Failure[F, R], ks: Success[B, F, R]): F[R] = {
39 def ks_(f: A => B): F[R] = {
40 def ks__(a: A) = ks(f(a))
41 return m.runParser(kf, ks__)
43 return fm.runParser(kf, ks_)
48 implicit def ParserMonad = new Monad[Parser] {
49 def point[A](a: => A) = a.point[Parser]
51 def bind[A, B](m: Parser[A])(f: A => Parser[B]) = new Parser[B] {
52 def runParser[F[_], R](kf: Failure[F, R], ks: Success[B, F, R]): F[R] = {
53 def ks_(a: A) = f(a).runParser(kf, ks)
54 return m.runParser(kf, ks_)
59 implicit def ParserMonadError = new MonadError[({type λ[String, α] = Parser[α]})#λ, String] {
60 def point[A](a: => A) = a.point[Parser]
61 def bind[A, B](m: Parser[A])(f: A => Parser[B]) = m.flatMap(f)
63 def handleError[A](m: Parser[A])(f: String => Parser[A]) = new Parser[A] {
64 def runParser[F[_], R](kf: Failure[F, R], ks: Success[A, F, R]): F[R] = {
65 def kf_(e: String) = f(e).runParser(kf, ks)
66 return m.runParser(kf_, ks)
70 def raiseError[A](e: String) = new Parser[A] {
71 def runParser[F[_], R](kf: Failure[F, R], ks: Success[A, F, R]): F[R]
75 implicit def ToMonadErrorIdOps(e: String) = new {
76 def raiseError[A]: Parser[A]
77 = implicitly[MonadError[({type λ[String, α] = Parser[α]})#λ, String]].raiseError(e)
80 def runParser[A](p: Parser[A]): Either[String, A] = {
81 type F[R] = Either[String, R]
82 def left (e: String): F[A] = Left(e)
83 def right(x: A ): F[A] = Right(x)
84 return p.runParser(left, right)
88 def decode[A: FromRecord](tsv: StringLike[_]): Seq[A] = {
89 val lines = tsv.split('\n').filter(!_.isEmpty)
90 val header = lines.head.split('\t').map(Symbol(_))
91 val body = lines.tail.map(line => (header zip line.split('\t')).toMap)
92 return body.map(implicitly[FromRecord[A]].parseRecord)
96 def parseRecord(r: Record): A
100 def parseField(f: Field): Parser[A]
102 implicit def toFromFieldOps(f: Field) = new {
103 def parseField[A: FromField]
104 = implicitly[FromField[A]].parseField(f)
108 def toRecord(a: A): Record
112 def toField(a: A): Field
116 implicit def OptionFromField[A: FromField] = new FromField[Option[A]] {
117 def parseField(f: Field): Parser[Option[A]] = {
119 return (None : Option[A]).point[Parser]
122 f.parseField[A].map { Some(_) }
128 implicit def StringFromField = new FromField[String] {
129 def parseField(f: Field): Parser[String] = f.point[Parser]
133 implicit def IntFromField = new FromField[Int] {
134 def parseField(f: Field): Parser[Int] = {
136 f.toInt.point[Parser]
139 case e: NumberFormatException =>
140 e.getMessage().raiseError[Int]