Sha256: ad6eed4b53cacff43d1d34983262872f975513fe619ffa797438b61dcfc22139

Contents?: true

Size: 1.5 KB

Versions: 9

Compression:

Stored size: 1.5 KB

Contents

# frozen_string_literal: true

# Deep extensions for Enumerable.
module Enumerable
  def deep_transform_keys!(&block)
    each { |value| value.deep_transform_keys!(&block) if value.respond_to?(:deep_transform_keys!) }
    self
  end

  def deep_dup(result = {})
    map do |value|
      value.respond_to?(:deep_dup) ? value.deep_dup : value.clone
    end
    result
  end
end

# Deep extensions for Hash.
class Hash
  def deep_transform_keys!(&block)
    transform_keys!(&:to_s)
    each_value { |value| value.deep_transform_keys!(&block) if value.respond_to?(:deep_transform_keys!) }
    self
  end

  def deep_dup(result = {})
    each do |key, value|
      result[key] = value.respond_to?(:deep_dup) ? value.deep_dup : value.clone
    end
    result
  end

  def deep_set(*path, value:)
    raise ArgumentError, 'no path specified' if path.empty?

    if path.size == 1
      self[path[0]] = value
    else
      raise KeyError, "key not found: #{path[0]}" unless key?(path[0])
      raise ArgumentError, "value for key is not a hash: #{path[0]}" unless self.[](path[0]).is_a?(Hash)

      self.[](path[0]).deep_set(*path[1..], value: value)
    end
  end

  def deep_delete(*path)
    raise ArgumentError, 'no path specified' if path.empty?
    raise KeyError, "key not found: #{path[0]}" unless key?(path[0])

    if path.size == 1
      delete(path[0])
    else
      raise ArgumentError, "value for key is not a hash: #{path[0]}" unless self.[](path[0]).is_a?(Hash)

      self.[](path[0]).deep_delete(*path[1..])
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
sqlui-0.1.28 app/deep.rb
sqlui-0.1.27 app/deep.rb
sqlui-0.1.26 app/deep.rb
sqlui-0.1.25 app/deep.rb
sqlui-0.1.24 app/deep.rb
sqlui-0.1.23 app/deep.rb
sqlui-0.1.22 app/deep.rb
sqlui-0.1.21 app/deep.rb
sqlui-0.1.20 app/deep.rb