Skip to content

Commit bc503f3

Browse files
committed
refactor and optimize
1 parent 0825576 commit bc503f3

File tree

2 files changed

+22
-15
lines changed

2 files changed

+22
-15
lines changed

lib/memery.rb

+21-14
Original file line numberDiff line numberDiff line change
@@ -53,40 +53,47 @@ def memoized?(method_name)
5353
def prepend_memery_module!
5454
return if defined?(@_memery_module)
5555
@_memery_module = Module.new { extend MemoizationModule }
56-
prepend @_memery_module
56+
prepend(@_memery_module)
5757
end
5858

59-
def define_memoized_method!(*args, **kwargs)
60-
@_memery_module.public_send __method__, self, *args, **kwargs
59+
def define_memoized_method!(method_name, **options)
60+
@_memery_module.define_memoized_method!(self, method_name, **options)
6161
end
6262

6363
module MemoizationModule
64+
Cache = Struct.new(:result, :time) do
65+
def fresh?(ttl)
66+
return true if ttl.nil?
67+
Memery.monotonic_clock <= time + ttl
68+
end
69+
end
70+
6471
def define_memoized_method!(klass, method_name, condition: nil, ttl: nil)
6572
method_key = "#{method_name}_#{object_id}"
6673

6774
original_visibility = method_visibility(klass, method_name)
75+
original_arity = klass.instance_method(method_name).arity
6876

69-
define_method method_name do |*args, &block|
77+
define_method(method_name) do |*args, &block|
7078
if block || (condition && !instance_exec(&condition))
7179
return super(*args, &block)
7280
end
7381

74-
store = (@_memery_memoized_values ||= {})[method_key] ||= {}
82+
cache_store = (@_memery_memoized_values ||= {})
83+
cache_key = original_arity.zero? ? method_key : [method_key, *args]
84+
cache = cache_store[cache_key]
7585

76-
if store.key?(args) &&
77-
(ttl.nil? || Memery.monotonic_clock <= store[args][:time] + ttl)
78-
return store[args][:result]
79-
end
86+
return cache.result if cache&.fresh?(ttl)
8087

8188
result = super(*args)
82-
@_memery_memoized_values[method_key][args] =
83-
{ result: result, time: Memery.monotonic_clock }
89+
new_cache = Cache.new(result, Memery.monotonic_clock)
90+
cache_store[cache_key] = new_cache
91+
8492
result
8593
end
8694

87-
ruby2_keywords method_name
88-
89-
send original_visibility, method_name
95+
ruby2_keywords(method_name)
96+
send(original_visibility, method_name)
9097
end
9198

9299
private

lib/memery/version.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# frozen_string_literal: true
22

33
module Memery
4-
VERSION = "1.4.0"
4+
VERSION = "1.4.1"
55
end

0 commit comments

Comments
 (0)