Sha256: 0b58e9c8b6cae81ff3824ced9da5ca61e8e7fd28b4151151034626e3e71e0d47

Contents?: true

Size: 1.3 KB

Versions: 4

Compression:

Stored size: 1.3 KB

Contents

module Yoda
  module Store
    module Objects
      class Map

        # @return [String]
        attr_reader :path

        # @return [Adapter]
        attr_reader :adapter

        # @return [Hash]
        attr_reader :cache

        # @return [Set]
        attr_reader :updated_keys

        # @param adapter [Adapters::Base]
        # @param path [String]
        def initialize(adapter:, path:)
          @adapter = adapter
          @path = path
          @cache = {}
          @updated_keys = Set.new
        end

        def separator
          '::'
        end

        def []=(key, value)
          updated_keys.add(key.to_sym)
          cache[key.to_sym] = value
        end

        def [](key)
          cache.fetch(key.to_sym) do
            cache[key.to_sym] = adapter.get(path_for(key))
          end
        end

        def save
          updated_keys.each do |key|
            adapter.put(path_for(key), self[key.to_sym])
          end
        end

        def keys
          @adapter_keys ||= adapter.keys.select { |key| key.start_with?("#{path}#{separator}") }.map { |key| key.slice(("#{path}#{separator}".length)..-1).to_sym }
          Set.new(@adapter_keys) + updated_keys
        end

        private

        def path_for(key)
          "#{path}#{separator}#{key}"
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
yoda-language-server-0.10.1 lib/yoda/store/objects/map.rb
yoda-language-server-0.10.0 lib/yoda/store/objects/map.rb
yoda-language-server-0.9.0 lib/yoda/store/objects/map.rb
yoda-language-server-0.8.0 lib/yoda/store/objects/map.rb