aglushkov/serega

View on GitHub
lib/serega/utils/enum_deep_dup.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

class Serega
  #
  # Utilities
  #
  module SeregaUtils
    #
    # Duplicates nested hashes and arrays
    # It does not duplicate any non-Array and non-Hash values
    #
    class EnumDeepDup
      class << self
        #
        # Deeply duplicate provided Array or Hash data
        # It does not duplicate any non-Array and non-Hash values
        #
        # @param data [Hash, Array] Data to duplicate
        #
        # @return [Hash, Array] Duplicated data
        #
        def call(data)
          case data
          when Hash
            # https://github.com/fastruby/fast-ruby#hash-vs-hashdup-code
            data = Hash[data] # rubocop:disable Style/HashConversion
            dup_hash_values(data)
          when Array
            data = data.dup
            dup_array_values(data)
          end

          data
        end

        private

        def dup_hash_values(data)
          data.transform_values! { |value| call(value) }
        end

        def dup_array_values(data)
          data.map! { |value| call(value) }
        end
      end
    end
  end
end