package jp.ymir.taskReporter.core import scala.collection._ import scala.collection.immutable.StringLike import scala.language.higherKinds import scalaz._ object TSV { type Header = Seq[Symbol] type Field = String type Record = Map[Symbol, Field] // --- type Failure[ F[_, _], E, R] = E => F[E, R] type Success[A, F[_, _], E, R] = A => F[E, 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[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[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[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__) } return fm.runParser(kf, ks_) } } } 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[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_) } } } 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) } // --- def decode[A: FromRecord](tsv: StringLike[_]): Seq[A] = { val lines = tsv.split('\n').filter(!_.isEmpty) val header = lines.head.split('\t').map(Symbol(_)) val body = lines.tail.map(line => (header zip line.split('\t')).toMap) return body.map(implicitly[FromRecord[A]].parseRecord) } trait FromRecord[A] { def parseRecord(r: Record): A } trait FromField[A] { def parseField(f: Field): A } def parseField[A: FromField](f: Field): A = implicitly[FromField[A]].parseField(f) trait ToRecord[A] { def toRecord(a: A): Record } trait ToField[A] { def toField(a: A): Field } // Option[A] implicit def OptionFromField[A: FromField] = new FromField[Option[A]] { def parseField(f: Field): Option[A] = { if (f.isEmpty) { return None } else { return Some(implicitly[FromField[A]].parseField(f)) } } } // String implicit def StringFromField = new FromField[String] { def parseField(f: Field): String = f } // Int implicit def IntFromField = new FromField[Int] { def parseField(f: Field): Int = f.toInt } }