Sha256: cd31c1fd33bb96aa14e6866a0851850b109ed7866d888610a6e373d537e8dca9

Contents?: true

Size: 1.72 KB

Versions: 37

Compression:

Stored size: 1.72 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

          def inherited(subclass)
            super
            subclass.reducers = reducers.dup
          end
        end

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

          def initialize_dup(other)
            @stack = other.instance_variable_get(:@stack).dup
          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

37 entries across 37 versions & 1 rubygems

Version Path
katalyst-tables-3.8.0 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.7.0 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.6.2 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.6.1 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.6.0 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.5.5 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.5.4 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.5.3 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.5.2 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.5.1 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.5.0 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.4.6 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.4.5 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.4.4 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.4.3 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.4.2 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.4.1 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.4.0 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.3.4 app/models/concerns/katalyst/tables/collection/reducers.rb
katalyst-tables-3.3.3 app/models/concerns/katalyst/tables/collection/reducers.rb