Module: Memo::It

Defined in:
lib/memo/it.rb

Instance Method Summary collapse

Instance Method Details

#memo(only: [], except: [], provided: [], &block) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/memo/it.rb', line 19

def memo(only: [], except: [], provided: [], &block)
  return yield unless Memo.enabled?

  only = Array(only)
  if only.empty?
    except = Array(except)
    key_names = block.binding.local_variables
    key_names -= except unless except.empty?
  else
    key_names = only
  end

  keys = block.source_location
  keys << key_names.flat_map { |name| [name, block.binding.local_variable_get(name)] }
  keys << Array(provided)

  @_memo_it ||= {}
  return @_memo_it[keys] if @_memo_it.key?(keys)
  @_memo_it[keys] = yield
end