Newer
Older
package amyc.utils
// A sequence of operations to be run by the compiler,
// with interruption at every stage if there is an error
abstract class Pipeline[-F, +T] {
self =>
def andThen[G](thenn: Pipeline[T, G]): Pipeline[F, G] = new Pipeline[F,G] {
def run(ctx : Context)(v : F) : G = {
val first = self.run(ctx)(v)
ctx.reporter.terminateIfErrors()
thenn.run(ctx)(first)
}
}
def run(ctx: Context)(v: F): T
}
case class Noop[T]() extends Pipeline[T, T] {
def run(ctx: Context)(v: T) = v
}