All Downloads are FREE. Search and download functionalities are using the official Maven repository.

atto.ParseResult.scala Maven / Gradle / Ivy

package atto

import java.lang.String
import scala.{ Option, Some, None, Nothing, List }
import scalaz._
import Scalaz._

sealed abstract class ParseResult[+A] {
  def map[B](f: A => B): ParseResult[B]
  def feed(s: String): ParseResult[A]
  def option: Option[A]
  def either: String \/ A
  def done: ParseResult[A] = feed("")
}

object ParseResult extends ParseResultInstances {

  case class Fail(input: String, stack: List[String], message: String) extends ParseResult[Nothing] {
    def map[B](f: Nothing => B) = Fail(input, stack, message)
    def feed(s: String) = this
    override def done = this
    def option = None
    def either = -\/(message)
  }

  case class Partial[+T](k: String => ParseResult[T]) extends ParseResult[T] {
    def map[B](f: T => B) = Partial(s => k(s).map(f))
    def feed(s: String) = k(s)
    def option = None
    def either = -\/("incomplete input")
  }

  case class Done[+T](input: String, result: T) extends ParseResult[T] {
    def map[B](f: T => B) = Done(input, f(result))
    def feed(s: String) = Done(input + s, result)
    override def done = this
    def option = Some(result)
    def either = \/-(result)
  }

}

trait ParseResultInstances {

  implicit val functor: Functor[ParseResult] =
    new Functor[ParseResult] {
      def map[A,B](ma: ParseResult[A])(f: A => B) =
        ma map f
    }

}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy