import scala.util.matching.Regex

trait Element

case class Number(value: Int) extends Element

object PlusOperator extends Element

case class ParseResult(elements: List[Element], rest: String)

trait Parser {
  def parse(value: String): Option[ParseResult]
}

case class AndCombinator(parsers: List[Parser]) extends Parser {
  def parse(value: String): Option[ParseResult] = {
    var r: Option[ParseResult] = None
    var current = value
    var elements = List[Element]()
    parsers.foreach { parser =>
      parser.parse(current) match {
        case None => return None
        case Some(ParseResult(elts, rest)) =>
          current = rest
          elements = elements ++ elts
      }
    }
    Some(ParseResult(elements, ""))
  }
}

object NumberParser extends Parser {
  def parse(value: String): Option[ParseResult] = {
    val regex = "^(\\d+)(.*)".r
    if (regex.matches(value)) {
      val result = regex.findAllIn(value)
      val s = result.group(1)
      Some(ParseResult(List(Number(s.toInt)), result.group(2)))
    } else {
      None
    }

  }
}

object PlusOperatorParser extends Parser {
  def parse(value: String): Option[ParseResult] = {
    val regex = "^\\+(.*)".r
    if (regex.matches(value)) {
      val result = regex.findAllIn(value)
      Some(ParseResult(List(PlusOperator), result.group(1)))
    } else {
      None
    }

  }
}