Sha256: 8ae3b23631085a688857d177470a82a179813a6a10ce0366df996759935e1e58
Contents?: true
Size: 1.88 KB
Versions: 4
Compression:
Stored size: 1.88 KB
Contents
# frozen_string_literal: true require 'plumb/composable' module Plumb class Pipeline include Composable class AroundStep include Composable def initialize(step, block) @step = step @block = block end def call(result) @block.call(@step, result) end end class << self def around_blocks @around_blocks ||= [] end def around(callable = nil, &block) around_blocks << (callable || block) self end def inherited(subclass) around_blocks.each { |block| subclass.around(block) } super end end attr_reader :children def initialize(type: Types::Any, freeze_after: true, &setup) @type = type @children = [type].freeze @around_blocks = self.class.around_blocks.dup return unless block_given? configure(&setup) freeze if freeze_after end def call(result) @type.call(result) end def step(callable = nil, &block) callable ||= block unless is_a_step?(callable) raise ArgumentError, "#step expects an interface #call(Result) Result, but got #{callable.inspect}" end callable = prepare_step(callable) callable = @around_blocks.reverse.reduce(callable) { |cl, bl| AroundStep.new(cl, bl) } if @around_blocks.any? @type >>= callable self end def around(callable = nil, &block) @around_blocks << (callable || block) self end private def configure(&setup) case setup.arity when 1 setup.call(self) when 0 instance_eval(&setup) else raise ArgumentError, 'setup block must have arity of 0 or 1' end end def is_a_step?(callable) return false unless callable.respond_to?(:call) true end def prepare_step(callable) = callable end end
Version data entries
4 entries across 4 versions & 1 rubygems
Version | Path |
---|---|
plumb-0.0.10 | lib/plumb/pipeline.rb |
plumb-0.0.9 | lib/plumb/pipeline.rb |
plumb-0.0.8 | lib/plumb/pipeline.rb |
plumb-0.0.7 | lib/plumb/pipeline.rb |