Sha256: 4c50c98d3c9911dbb3d80c7374faf581f8b2f44fe1325f43f353c05de2c6452c

Contents?: true

Size: 2 KB

Versions: 3

Compression:

Stored size: 2 KB

Contents

module Maxwell
  module Agent
    module Middleware
      class Chain
        include Enumerable
        attr_reader :entries

        def initialize
          @entries = []
          yield self if block_given?
        end

        def each(&block)
          entries.each(&block)
        end

        def add(klass, *args)
          new_entry = Entry.new(klass, *args)
          if count > 0
            add_at(count + 1, new_entry)
          else
            add_at(count, new_entry)
          end
        end

        def remove(entry)
          entries.delete_if {|e| e }
        end

        def insert_before(existing_klass, new_klass, *args)
          new_entry = Entry.new(new_klass, *args)
          i = get_index(existing_klass) || 0
          add_at(i, new_entry)
        end

        def insert_after(existing_klass, new_klass, *args)
          new_entry = Entry.new(new_klass, *args)
          i = get_index(existing_klass) || count - 1
          add_at(i + 1, new_entry)
        end

        def invoke(*args, &final_action)
          chain = retrieve.dup

          traverse_chain = -> do
            if chain.empty?
              final_action.call if final_action
            else
              chain.shift.call(*args, &traverse_chain)
            end
          end
          traverse_chain.call
        end

      private
        def add_at(index, new_entry)
          remove(new_entry) if exists?(new_entry)
          entries.insert(index, new_entry)
        end

        def get_index(klass)
          find_index {|entry| entry.klass == klass }
        end

        def exists?(entry)
          include?(entry)
        end

        def retrieve
          entries.map(&:build)
        end

        class Entry
          attr_reader :klass

          def initialize(klass, *args)
            @klass = klass
            @args = args
          end

          def build
            @klass.new(*@args)
          end

          def ==(other)
            self.klass == other.klass
          end
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
maxwell_agent-0.0.7 lib/maxwell/agent/middleware/chain.rb
maxwell_agent-0.0.5 lib/maxwell/agent/middleware/chain.rb
maxwell_agent-0.0.1 lib/maxwell/agent/middleware/chain.rb