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
|