+ type Header = Seq[Symbol]
+
+ case class Field(value: String) {
+ def parseField[A: FromField]
+ = implicitly[FromField[A]].parseField(Field(value))
+ }
+
+ case class Record(value: Map[Symbol, Field]) {
+ def parseRecord[A: FromRecord]
+ = implicitly[FromRecord[A]].parseRecord(Record(value))
+
+ def lookup[A: FromField](name: Symbol): Parser[A]
+ = value.get(name).fold(("no field named " + name.name).raiseError[A])(_.parseField[A])
+ }
+
+ type Failure[ F[_], R] = String => F[R]
+ type Success[A, F[_], R] = A => F[R]
+
+ trait Parser[+A] {
+ def runParser[F[_], R](kf: Failure[F, R], ks: Success[A, F, R]): F[R]
+ }
+