lib/rom/repository/changeset/pipe.rb in rom-repository-1.3.2 vs lib/rom/repository/changeset/pipe.rb in rom-repository-1.3.3

- old
+ new

@@ -23,44 +23,74 @@ # Composable data transformation pipe used by default in changesets # # @api private class Pipe < Transproc::Transformer[PipeRegistry] - attr_reader :processor + extend Initializer - def initialize(processor = self.class.transproc) - @processor = processor - end + param :processor, default: -> { self.class.transproc } + option :use_for_diff, optional: true, default: -> { true } + option :diff_processor, optional: true, default: -> { use_for_diff ? processor : nil } def self.[](name) container[name] end def [](name) self.class[name] end def bind(context) - if processor.is_a?(Proc) - self.class.new(Pipe[-> *args { context.instance_exec(*args, &processor) }]) - else - self - end + return self unless processor.is_a?(Proc) || diff_processor.is_a?(Proc) + + new(bind_processor(processor, context), diff_processor: bind_processor(diff_processor, context)) end - def >>(other) - if processor - Pipe.new(processor >> other) + def compose(other, use_for_diff: other.is_a?(Pipe) ? other.use_for_diff : false) + new_proc = processor ? processor >> other : other + + if use_for_diff + diff_proc = diff_processor ? diff_processor >> other : other + new(new_proc, diff_processor: diff_proc) else - Pipe.new(other) + new(new_proc) end end + alias_method :>>, :compose def call(data) if processor processor.call(data) else data + end + end + + def for_diff(data) + if diff_processor + diff_processor.call(data) + else + data + end + end + + def with(opts) + if opts.empty? + self + else + Pipe.new(processor, options.merge(opts)) + end + end + + def new(processor, opts = EMPTY_HASH) + Pipe.new(processor, options.merge(opts)) + end + + def bind_processor(processor, context) + if processor.is_a?(Proc) + self[-> *args { context.instance_exec(*args, &processor) }] + else + processor end end end end end