Class: Memoizable::Memory

Inherits:
Object
  • Object
show all
Defined in:
lib/memoizable/memory.rb

Overview

Storage for memoized methods

Instance Method Summary collapse

Constructor Details

#initializeundefined

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Initialize the memory storage for memoized methods



13
14
15
16
17
# File 'lib/memoizable/memory.rb', line 13

def initialize
  @memory  = ThreadSafe::Cache.new
  @monitor = Monitor.new
  freeze
end

Instance Method Details

#[](name) ⇒ Object

Get the value from memory

Parameters:

  • name (Symbol)

Returns:

  • (Object)


26
27
28
29
30
# File 'lib/memoizable/memory.rb', line 26

def [](name)
  @memory.fetch(name) do
    fail NameError, "No method #{name} is memoized"
  end
end

#[]=(name, value) ⇒ undefined

Store the value in memory

Parameters:

  • name (Symbol)
  • value (Object)

Returns:

  • (undefined)


40
41
42
43
44
45
46
47
# File 'lib/memoizable/memory.rb', line 40

def []=(name, value)
  memoized = true
  @memory.compute_if_absent(name) do
    memoized = false
    value
  end
  fail ArgumentError, "The method #{name} is already memoized" if memoized
end

#fetch(name) ⇒ Object

Fetch the value from memory, or store it if it does not exist

Parameters:

  • name (Symbol)

Yield Returns:

  • (Object)

    the value to memoize



57
58
59
60
61
62
63
64
65
# File 'lib/memoizable/memory.rb', line 57

def fetch(name)
  @memory.fetch(name) do       # check for the key
    @monitor.synchronize do    # acquire a lock if the key is not found
      @memory.fetch(name) do   # recheck under lock
        self[name] = yield     # set the value
      end
    end
  end
end

#key?(name) ⇒ Boolean

Test if the name has a value in memory

Parameters:

  • name (Symbol)

Returns:

  • (Boolean)


74
75
76
# File 'lib/memoizable/memory.rb', line 74

def key?(name)
  @memory.key?(name)
end