Sha256: 017e22c54d12b37e689143e0960f8712371694650d0ce02894223db15b561c5d

Contents?: true

Size: 1017 Bytes

Versions: 10

Compression:

Stored size: 1017 Bytes

Contents

# frozen_string_literal: true

module MetalArchives
  ##
  # Generic LRU memory cache
  #
  class LRUCache
    def initialize(size = 100)
      @size = size

      # Underlying data store
      @cache = {}

      # Array of keys in order of insertion
      @keys = []
    end

    def []=(key, value)
      @cache[key] = value

      @keys.delete key if @keys.include? key

      @keys << key

      pop if @keys.size > @size
    end

    def [](key)
      if @keys.include? key
        MetalArchives.config.logger.debug "Cache hit for #{key}"
        @keys.delete key
        @keys << key
      else
        MetalArchives.config.logger.debug "Cache miss for #{key}"
      end

      @cache[key]
    end

    def clear
      @cache.clear
      @keys.clear
    end

    def include?(key)
      @cache.include? key
    end

    def delete(key)
      @cache.delete key
    end

    private

    def pop
      to_remove = @keys.shift @keys.size - @size

      to_remove.each { |key| @cache.delete key }
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
metal_archives-3.0.1 lib/metal_archives/lru_cache.rb
metal_archives-3.0.0 lib/metal_archives/lru_cache.rb
metal_archives-2.2.3 lib/metal_archives/lru_cache.rb
metal_archives-2.2.0 lib/metal_archives/utils/lru_cache.rb
metal_archives-2.1.1 lib/metal_archives/utils/lru_cache.rb
metal_archives-2.1.0 lib/metal_archives/utils/lru_cache.rb
metal_archives-2.0.2 lib/metal_archives/utils/lru_cache.rb
metal_archives-2.0.1 lib/metal_archives/utils/lru_cache.rb
metal_archives-2.0.0 lib/metal_archives/utils/lru_cache.rb
metal_archives-1.0.0 lib/metal_archives/utils/lru_cache.rb