Sha256: 99fe839ec73c032e4099f0126105c99c0845ce71be83048156cc4edf8f520840

Contents?: true

Size: 1.67 KB

Versions: 2

Compression:

Stored size: 1.67 KB

Contents

# frozen_string_literal: true

module Refinements
  # Refinements for Hashes.
  module Hashes
    # rubocop:disable Metrics/BlockLength
    refine Hash do
      # TODO: Remove when Ruby 2.4 is released.
      def compact
        puts "[DEPRECATION]: #compact is deprecated and is included, by default, in Ruby 2.4."
        dup.compact!
      end

      # TODO: Remove when Ruby 2.4 is released.
      def compact!
        puts "[DEPRECATION]: #compact! is deprecated and is included, by default, in Ruby 2.4."
        reject! { |_, value| value.nil? }
      end

      def symbolize_keys
        dup.symbolize_keys!
      end

      def symbolize_keys!
        keys.each { |key| self[key.to_sym] = delete(key) }
        self
      end

      def slice *keys
        keys.each.with_object({}) do |key, sliced_hash|
          sliced_hash[key] = self[key] if key?(key)
        end
      end

      def slice! *keys
        replace slice(*keys)
      end

      def deep_merge other_hash
        dup.deep_merge! other_hash
      end

      def deep_merge! other_hash
        other_hash.each.with_object self do |(other_key, other_value), original_hash|
          current_value = original_hash[other_key]
          original_hash[other_key] = deep_merge_value current_value, other_value
        end
      end

      def reverse_merge other_hash
        other_hash.merge self
      end

      def reverse_merge! other_hash
        merge!(other_hash) { |_, left_value, _| left_value }
      end

      private

      def deep_merge_value current_value, other_value
        return current_value.deep_merge(other_value) if current_value.is_a?(Hash) && other_value.is_a?(Hash)
        other_value
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
refinements-3.2.0 lib/refinements/hashes.rb
refinements-3.1.0 lib/refinements/hashes.rb