scala/ScalaBook/chapter-12/src/main/scala/scalabook/ep/family/oc/reprlang.scala

package scalabook.ep.family.oc

/**
 * Operation extensions (easy)
 * @author Christos KK Loverdos
 */

trait ReprLang extends BaseLang {
    class ReprOp extends BaseOp { this: Operation =>
        var result: Option[String] = None

        def apply(data: BaseD) = {
            data.perform(this)
            result.get
        }

        def computeNumD(data: NumD) {
            this.result = Some(data.value.toString)
        }
    }

    def newReprOp(): ReprOp with Operation

    object repr {
        def apply(data: BaseD) = newReprOp()(data)
    }
}

object FixReprLang extends ReprLang {
    type Operation = BaseOp

    def newEvalOp() = new EvalOp
    def newReprOp() = new ReprOp
}