Class Wee::LRUCache
In: lib/wee/lru_cache.rb
Parent: Object

Implementation of a Least Recently Used (LRU) Cache

Methods

[]   []=   delete   delete_if   each   fetch   garbage_collect   has_key?   min_key   new   store  

Classes and Modules

Class Wee::LRUCache::Item

Public Class methods

[Source]

# File lib/wee/lru_cache.rb, line 13
    def initialize(capacity=20, &replace_callback)
      @capacity = capacity
      @replace_callback = replace_callback
      @store = Hash.new
      @time = 0
    end

Public Instance methods

[](key, default_value=nil)

Alias for fetch

[]=(key, value)

Alias for store

[Source]

# File lib/wee/lru_cache.rb, line 24
    def delete(key)
      @store.delete(key)
    end

[Source]

# File lib/wee/lru_cache.rb, line 28
    def delete_if
      @store.delete_if {|id, item|
        yield id, item.value
      }
    end

[Source]

# File lib/wee/lru_cache.rb, line 65
    def each(&block)
      @store.each(&block)
    end

[Source]

# File lib/wee/lru_cache.rb, line 34
    def fetch(key, default_value=nil)
      if item = @store[key]
        item.time = (@time += 1)
        item.value
      else
        default_value
      end
    end

[Source]

# File lib/wee/lru_cache.rb, line 62
    def garbage_collect
    end

[Source]

# File lib/wee/lru_cache.rb, line 20
    def has_key?(key)
      @store.has_key?(key)
    end

[Source]

# File lib/wee/lru_cache.rb, line 43
    def store(key, value)
      if item = @store[key]
        # update item only
        item.time = (@time += 1)
        item.value = value
      else
        # insert new item
        item = Item.new
        item.time = (@time += 1)
        item.value = value
        garbage_collect() if @store.size >= @capacity
        while @store.size >= @capacity 
          old_item = @store.delete(min_key()) || raise
          @replace_callback.call(old_item) if @replace_callback
        end
        @store[key] = item
      end
    end

Protected Instance methods

Returns the key of the minimum item

[Source]

# File lib/wee/lru_cache.rb, line 77
    def min_key
      min_k, min_time = nil, @time
      @store.each {|k, v|
        if v.time < min_time 
          min_k, min_time = k, v.time
        end
      }
      return min_k
    end

[Validate]