Sha256: 8b3984ca2d018bf4658e8cc20d6c71b259386a87c7242e686588a8ece418970e

Contents?: true

Size: 1.2 KB

Versions: 2

Compression:

Stored size: 1.2 KB

Contents

# frozen_string_literal: true

require 'attr/gather/aggregators/base'

module Attr
  module Gather
    module Aggregators
      # Deep merges result hashes
      #
      # @api public
      class DeepMerge < Base
        # Initialize a new DeepMerge aggregator
        #
        # @param reverse [Boolean] deep merge results in reverse order
        #
        # @api private
        def initialize(reverse: false, **)
          @reverse = reverse
          super
        end

        def call(input, execution_results)
          execution_results = execution_results.reverse_each if reverse?
          initial = unwrap_initial_input(input)

          execution_results.reduce(initial) do |memo, res|
            deep_merge(memo, unwrap_result(res))
          end
        end

        private

        def unwrap_initial_input(input)
          input
        end

        def reverse?
          @reverse
        end

        def deep_merge(hash, other)
          Hash[hash].merge(other) do |_, orig, new|
            if orig.respond_to?(:to_hash) && new.respond_to?(:to_hash)
              deep_merge(Hash[orig], Hash[new])
            else
              new
            end
          end
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
attr-gather-1.3.0 lib/attr/gather/aggregators/deep_merge.rb
attr-gather-1.2.0 lib/attr/gather/aggregators/deep_merge.rb