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
# File 'lib/memoizable/memory.rb', line 13

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

Instance Method Details

#[](name) ⇒ Object

Get the value from memory

Parameters:

  • name (Symbol)

Returns:

  • (Object)


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

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)


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

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, &block) ⇒ Object

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

Parameters:

  • name (Symbol)

Yield Returns:

  • (Object)

    the value to memoize



56
57
58
# File 'lib/memoizable/memory.rb', line 56

def fetch(name, &block)
  @memory.compute_if_absent(name, &block)
end

#key?(name) ⇒ Boolean

Test if the name has a value in memory

Parameters:

  • name (Symbol)

Returns:

  • (Boolean)


79
80
81
# File 'lib/memoizable/memory.rb', line 79

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

#set(data) ⇒ Memory

Set the memory

Parameters:

  • (Hash)

Returns:



67
68
69
70
# File 'lib/memoizable/memory.rb', line 67

def set(data)
  data.each { |name, value| self[name] = value }
  self
end