Sha256: 4e6b81d2fd9da3fa0090b5388ca0f1a444089ed6131328a10aad55f9d5f9dc7f

Contents?: true

Size: 1.2 KB

Versions: 7

Compression:

Stored size: 1.2 KB

Contents

# frozen_string_literal: true

module Nocode
  module Util
    # A hash-like object which ensures all keys are strings.
    class Dictionary
      extend Forwardable

      NEWLINE_CHAR = "\n"

      class << self
        def ensure(value)
          if value.is_a?(self)
            value
          else
            new(value)
          end
        end
      end

      attr_reader :values

      def_delegators :values, :empty?

      def initialize(values = {})
        @values = {}

        (values || {}).each { |k, v| assign(k, v) }

        freeze
      end

      def delete(key)
        tap { values.delete(keyify(key)) }
      end

      def []=(key, value)
        tap { values[keyify(key)] = value }
      end

      def [](key)
        values[keyify(key)]
      end

      def dig(*keys)
        top_level = keyify(keys.first)
        keys = [top_level] + keys[1..]

        values.dig(*keys)
      end

      def key?(key)
        values.key?(keyify(key))
      end

      def to_s
        values.map { |k, v| "#{k}: #{v}" }.join(NEWLINE_CHAR)
      end

      private

      def assign(key, value)
        values[keyify(key)] = value
      end

      def keyify(value)
        value.to_s
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
nocode-0.0.10 lib/nocode/util/dictionary.rb
nocode-0.0.9 lib/nocode/util/dictionary.rb
nocode-0.0.8 lib/nocode/util/dictionary.rb
nocode-0.0.7 lib/nocode/util/dictionary.rb
nocode-0.0.6 lib/nocode/util/dictionary.rb
nocode-0.0.5 lib/nocode/util/dictionary.rb
nocode-0.0.4 lib/nocode/util/dictionary.rb