Sha256: 1a9b0137a2aec1bb5938b9ffde3622f89096fd750520190f8813c658ec65725a

Contents?: true

Size: 1.36 KB

Versions: 2

Compression:

Stored size: 1.36 KB

Contents

require 'concurrent'
require 'forwardable'

module Yoda
  module Store
    # Registry Cache is a cache layer for {Registry}.
    # This class intended to reduce patch calculations of {PatchSet#patch}.
    class Registry::Cache
      class RegistryWrapper
        extend Forwardable
        include MissingDelegatable

        delegate_missing :registry

        attr_reader :registry

        def initialize(registry, cache = Registry::Cache.new)
          @registry = registry
          @cache = cache
        end

        def get(key, **kwargs)
          @cache.fetch_or_calc(key) do
            @registry.get(key, **kwargs)
          end
        end

        def clear_cache
          @cache.delete_all
        end
      end

      def initialize
        @data = Concurrent::Map.new
      end

      # @param key [String, Symbol]
      def fetch_or_calc(key)
        if cache = data.get(key.to_sym)
          return cache
        end
        yield.tap { |value| data.put_if_absent(key.to_sym, value) }
      end

      # @param key [String, Symbol]
      def delete(key)
        data.delete(key.to_sym)
      end

      def delete_all
        data.clear
      end

      # @param patch [Objects::Patch]
      def clear_from_patch(patch)
        patch.keys.each { |key| delete(key) }
      end

      private

      # @return [Concurrent::Map]
      attr_reader :data
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
yoda-language-server-0.10.1 lib/yoda/store/registry/cache.rb
yoda-language-server-0.10.0 lib/yoda/store/registry/cache.rb