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