Sha256: 4b6c01543d99e43f6e7fd86d13f66dd446cb340ca7dbc140812738e8d38ed738

Contents?: true

Size: 1.38 KB

Versions: 5

Compression:

Stored size: 1.38 KB

Contents

# frozen_string_literal: true

module Recollect::Array
  module Utility
    module Keys
      extend self

      DELIMITER_REGEX = /\[|\]|\./

      def to_ary(key)
        return [] if key.empty?

        key.to_s.split(DELIMITER_REGEX).reject(&:empty?)
      end
      alias [] to_ary

      def to_dig(key)
        enforce_level = ->(level) do
          if level.is_a?(Integer) || level.match?(/^\d$/)
            level.to_i
          else
            level.to_sym
          end
        end

        Keys[key].map(&enforce_level)
      end
    end

    # ### Utility::TryFetchOrBlank
    # `fetch value into hash, like Lodash.get`
    #
    # ````
    # hash = { a: 1, b: { c: 2 }, d: ['1'] }
    # Utility::TryFetchOrBlank.call(hash, :b, :c)
    # ````
    #
    # ````
    # hash = { a: 1, b: { c: 2 }, d: ['1'] }
    # Utility::TryFetchOrBlank[hash, 'd.0']
    # ````
    #
    # ````
    # hash = { a: 1, b: { c: 2 }, d: [{ e: 3 }] }
    # Utility::TryFetchOrBlank.(hash, 'd.0.e')

    # hash = { a: 1, b: { c: 2 }, d: [{ e: 3 }] }
    # Utility::TryFetchOrBlank.(hash, 'd[0]e')

    # hash = { a: 1, b: { c: 2 }, d: [{ e: 3 }] }
    # Utility::TryFetchOrBlank.(hash, 'd.[0].e')
    # ````
    TryFetchOrBlank = ->(data, *keys) do
      reducer = ->(memo, key) do
        memo.to_h.dig(*Keys.to_dig(key))
      rescue StandardError
        nil
      end

      keys.reduce(data, &reducer)
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
recollect-array-0.1.4 lib/recollect/array/utility.rb
recollect-array-0.1.3 lib/recollect/array/utility.rb
recollect-array-0.1.2 lib/recollect/array/utility.rb
recollect-array-0.1.1 lib/recollect/array/utility.rb
recollect-array-0.1.0 lib/recollect/array/utility.rb