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 }