module Memery::ClassMethods

Module for class methods

Public Instance Methods

memoize(method_name, condition: nil, ttl: nil) click to toggle source
TODO: Resolve this

rubocop:disable Metrics/MethodLength rubocop:disable Metrics/AbcSize rubocop:disable Metrics/CyclomaticComplexity rubocop:disable Metrics/PerceivedComplexity

# File lib/memery.rb, line 41
def memoize(method_name, condition: nil, ttl: nil)
  original_visibility = Memery.method_visibility(self, method_name)

  original_method = memoized_methods[method_name] = instance_method(method_name)

  undef_method method_name

  define_method method_name do |*args, &block|
    if block || (condition && !instance_exec(&condition))
      return original_method.bind(self).call(*args, &block)
    end

    method_object_id = original_method.object_id

    store =
      ((@_memery_memoized_values ||= {})[method_name] ||= {})[method_object_id] ||= {}

    if store.key?(args) && (ttl.nil? || Memery.monotonic_clock <= store[args][:time] + ttl)
      return store[args][:result]
    end

    result = original_method.bind(self).call(*args)
    @_memery_memoized_values[method_name][method_object_id][args] =
      { result: result, time: Memery.monotonic_clock }
    result
  end

  ruby2_keywords method_name

  send original_visibility, method_name

  method_name
end
memoized?(method_name) click to toggle source

rubocop:enable Metrics/MethodLength rubocop:enable Metrics/AbcSize rubocop:enable Metrics/CyclomaticComplexity rubocop:enable Metrics/PerceivedComplexity

# File lib/memery.rb, line 79
def memoized?(method_name)
  memoized_methods.key?(method_name)
end
memoized_methods() click to toggle source
# File lib/memery.rb, line 32
def memoized_methods
  @memoized_methods ||= {}
end