Sha256: ffe3931cfd3fd546536bd35774219bafc6b2e7cde720f4da3ccb95fbcaac6eec

Contents?: true

Size: 1.27 KB

Versions: 4

Compression:

Stored size: 1.27 KB

Contents

class PeakFlowUtils::DeepMerger < PeakFlowUtils::ApplicationService
  attr_reader :hashes, :object_mappings

  def initialize(hashes:, object_mappings: {})
    @hashes = hashes
    @object_mappings = object_mappings
  end

  def perform
    merged = {}

    hashes.each do |hash|
      merge_hash(hash, merged)
    end

    succeed! merged
  end

  def clone_something(object)
    if object.is_a?(Hash)
      new_hash = {}
      merge_hash(object, new_hash)
      new_hash
    elsif object.is_a?(Array)
      new_array = []
      merge_array(object, new_array)
      new_array
    else
      object
    end
  end

  def merge_something(object, merged)
    if object.is_a?(Array)
      merge_array(object, merged)
    elsif object.is_a?(Hash)
      merge_hash(object, merged)
    else
      raise "Unknown object: #{object.class.name}"
    end
  end

  def merge_array(array, merged)
    array.each do |value|
      merged << clone_something(value)
    end
  end

  def merge_hash(hash, merged)
    hash.each do |key, value|
      if value.is_a?(Array)
        merged[key] = []
        merge_array(value, merged[key])
      elsif value.is_a?(Hash)
        merged[key] ||= {}
        merge_hash(value, merged[key])
      else
        merged[key] = clone_something(value)
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
peak_flow_utils-0.1.19 app/services/peak_flow_utils/deep_merger.rb
peak_flow_utils-0.1.18 app/services/peak_flow_utils/deep_merger.rb
peak_flow_utils-0.1.17 app/services/peak_flow_utils/deep_merger.rb
peak_flow_utils-0.1.16 app/services/peak_flow_utils/deep_merger.rb