Module: Bogo::Memoization

Defined in:
lib/bogo/memoization.rb

Overview

Memoization helpers

Constant Summary collapse

EXCLUSIVE_LOCK =

Lock for providing exclusive access

Mutex.new
GLOBAL_MEMOS =

Holder for global memoization items

Smash.new

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.cleanup(object_id) ⇒ Proc

Clean up isolated memoizations

Parameters:

  • object_id (Object)

Returns:

  • (Proc)


14
15
16
17
18
19
20
# File 'lib/bogo/memoization.rb', line 14

def cleanup(object_id)
  proc do
    Thread.current[:bogo_memoization].delete_if do |k,v|
      k.to_s.start_with?(object_id.to_s)
    end if Thread.current[:bogo_memoization].is_a?(Hash)
  end
end

.clear_current!nil

Clear thread memoizations

Returns:

  • (nil)


25
26
27
# File 'lib/bogo/memoization.rb', line 25

def clear_current!
  Thread.current[:bogo_memoization] = nil
end

.clear_global!nil

Clear global memoizations

Returns:

  • (nil)


32
33
34
35
36
# File 'lib/bogo/memoization.rb', line 32

def clear_global!
  EXCLUSIVE_LOCK.synchronize do
    GLOBAL_MEMOS.clear
  end
end

Instance Method Details

#_memoSmash

Returns memoization hash for current thread.

Returns:

  • (Smash)

    memoization hash for current thread



66
67
68
69
70
71
72
# File 'lib/bogo/memoization.rb', line 66

def _memo
  unless(Thread.current[:bogo_memoization])
    Thread.current[:bogo_memoization] = Smash.new
    ObjectSpace.define_finalizer(self, Bogo::Memoization.cleanup(self.object_id))
  end
  Thread.current[:bogo_memoization]
end

#clear_memoizations!TrueClass

Remove all memoized values

Returns:

  • (TrueClass)


113
114
115
116
117
118
119
120
# File 'lib/bogo/memoization.rb', line 113

def clear_memoizations!
  _memo.keys.find_all do |key|
    key.to_s.start_with?("#{self.object_id}_")
  end.each do |key|
    _memo.delete(key)
  end
  true
end

#memoize(key, direct = false) { ... } ⇒ Object

Memoize data

Parameters:

  • key (String, Symbol)

    identifier for data

  • direct (Truthy, Falsey) (defaults to: false)

    direct skips key prepend of object id

Yields:

  • block to create data

Yield Returns:

  • data to memoize

Returns:

  • (Object)

    data



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/bogo/memoization.rb', line 46

def memoize(key, direct=false)
  unless(direct)
    key = "#{self.object_id}_#{key}"
  end
  if(direct == :global)
    EXCLUSIVE_LOCK.synchronize do
      unless(GLOBAL_MEMOS.has_key?(key))
        GLOBAL_MEMOS[key] = yield
      end
      GLOBAL_MEMOS[key]
    end
  else
    unless(_memo.has_key?(key))
      _memo[key] = yield
    end
    _memo[key]
  end
end

#memoized?(key, direct = false) ⇒ TrueClass, FalseClass

Check if memoization entry for given key exists

Parameters:

  • key (String, Symbol)

    identifier for data

  • direct (Truthy, Falsey) (defaults to: false)

    direct skips key prepend of object id

Returns:

  • (TrueClass, FalseClass)


79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/bogo/memoization.rb', line 79

def memoized?(key, direct=false)
  unless(direct)
    key = "#{self.object_id}_#{key}"
  end
  if(direct == :global)
    EXCLUSIVE_LOCK.synchronize do
      GLOBAL_MEMOS.key?(key)
    end
  else
    _memo.key?(key)
  end
end

#unmemoize(key, direct = false) ⇒ Object

Remove memoized value

Parameters:

  • key (String, Symbol)

    identifier for data

  • direct (Truthy, Falsey) (defaults to: false)

    direct skips key prepend of object id

Returns:

  • (Object)

    removed instance



97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/bogo/memoization.rb', line 97

def unmemoize(key, direct=false)
  unless(direct)
    key = "#{self.object_id}_#{key}"
  end
  if(direct == :global)
    EXCLUSIVE_LOCK.synchronize do
      GLOBAL_MEMOS.delete(key)
    end
  else
    _memo.delete(key)
  end
end