Sha256: c22b623dc1e2d192e0e53fda7426982b47a0fdbba54ac41837e3fc5a99a20b7f

Contents?: true

Size: 1.5 KB

Versions: 11

Compression:

Stored size: 1.5 KB

Contents

# frozen_string_literal: true

module Katalyst
  module Tables
    module Collection
      # Adds stackable reducers to a collection.
      # Inspired by ActiveDispatch::MiddlewareStack which unfortunately can't
      # be used due to monkey patches from gems such as NewRelic which assume
      # it is only used for Rack middleware.
      module Reducers
        extend ActiveSupport::Concern

        included do
          class_attribute :reducers, default: Stack.new
        end

        class_methods do
          delegate :use, :insert, to: :reducers
        end

        class Stack # :nodoc:
          def initialize
            @stack = []
          end

          def use(klass)
            @stack << Reducer.new(klass) unless index(klass)
          end

          def insert(other, klass)
            @stack.insert(index(other), Reducer.new(klass))
          end

          def index(klass)
            @stack.index(Reducer.new(klass))
          end

          def build(&block)
            @stack.freeze.reduce(block) do |app, reducer|
              reducer.build(app)
            end
          end
        end

        class Reducer # :nodoc:
          attr_reader :klass

          def initialize(klass)
            @klass = klass
          end

          def build(app)
            klass.new(app)
          end

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

          def inspect
            "#<#{self.class.name} #{klass.name}>"
          end
        end
      end
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
katalyst-tables-2.2.7 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-2.2.6 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-2.2.5 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-2.2.4 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-2.2.3 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-2.2.2 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-2.2.1 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-2.2.0 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-2.1.3 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-2.1.2 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-2.1.1 app/models/concerns/katalyst/tables/collection/reducers.rb