module Memo::It

Public Instance Methods

memo(only: [], except: [], provided: []) { || ... } click to toggle source
# 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