Sha256: b40318fcc6a6d2f038dc8210e654dd1ebc958caef80bd81a8e0cb1c31e6a96c2

Contents?: true

Size: 811 Bytes

Versions: 1

Compression:

Stored size: 811 Bytes

Contents

require_relative 'refinements'
require_relative 'parser'

module Rack
  module Reducer
    # call `reduce` on a params hash, filtering data via lambdas with
    # matching keyword arguments
    class Reduction
      using Refinements # define Proc#required_argument_names, #satisfies?, etc

      DEFAULTS = {
        dataset: [],
        filters: [],
        params: nil
      }.freeze

      def initialize(options)
        @props = DEFAULTS.merge(options)
        @params = Parser.call(@props[:params])
      end

      def reduce
        @props[:filters].reduce(@props[:dataset]) do |data, filter|
          next data unless filter.satisfies?(@params)

          data.instance_exec(@params.slice(*filter.all_argument_names), &filter)
        end
      end
    end

    private_constant :Reduction
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rack-reducer-1.0.1 lib/rack/reducer/reduction.rb