Sha256: 82f7908dd3d8da2598e2e174e8658751cc9f2bac6dfa69df377a85cde1b469f8

Contents?: true

Size: 1.14 KB

Versions: 3

Compression:

Stored size: 1.14 KB

Contents

# frozen_string_literal: true

module Nocode
  module Util
    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

3 entries across 3 versions & 1 rubygems

Version Path
nocode-0.0.3 lib/nocode/util/dictionary.rb
nocode-0.0.2 lib/nocode/util/dictionary.rb
nocode-0.0.1 lib/nocode/util/dictionary.rb