Sha256: a669c3fc22960bb4a5ded7be4bcf5c0ea28596fb033049231356ea0ad830b4d9

Contents?: true

Size: 1.12 KB

Versions: 1

Compression:

Stored size: 1.12 KB

Contents

# frozen_string_literal: true

module Dotpath
  class Mutate
    def self.mutate(obj, &block)
      case obj
      when Hash
        hash(obj, path: '', &block)
      when Array
        array(obj, &block)
      else
        obj
      end
    end

    def self.hash(obj, path: DELIMITER, &block)
      new_hash = {}
      obj.each do |key, value|
        new_path = [path, key].join(DELIMITER)
        case value
        when Hash
          new_hash[key] = hash(value, path: new_path, &block)
        when Array
          new_hash[key] = array(value, path: new_path, &block)
        else
          new_hash[key] = yield(new_path, value)
        end
      end
      new_hash
    end

    def self.array(obj, path: DELIMITER, &block)
      new_array = []
      index = 0
      obj.each do |value|
        new_path = "#{path}[#{index}]"
        case value
        when Hash
          new_array << hash(value, path: new_path, &block)
        when Array
          new_array << array(value, path: new_path, &block)
        else
          new_array << yield(new_path, value)
        end

        index += 1
      end
      new_array
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dotpath-0.1.0 lib/dotpath/mutate.rb