Module: Literal::Modifiers::Memoize

Defined in:
lib/literal/modifiers/memoize.rb

Instance Method Summary collapse

Instance Method Details

#memoize(method_name, size: 100) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/literal/modifiers/memoize.rb', line 4

def memoize(method_name, size: 100)
	original_method = instance_method(method_name)

	prepend extension = Module.new

	if original_method.arity == 0
		extension.module_eval <<~RUBY, __FILE__, __LINE__ + 1
		  # frozen_string_literal: true

			def #{method_name}
				cache = (@memoized ||= Concurrent::Map.new)
				cache.compute_if_absent(:#{method_name}) { super }
			end
		RUBY
	else
		extension.module_eval <<~RUBY, __FILE__, __LINE__ + 1
		  # frozen_string_literal: true

			def #{method_name}(*args)
				cache = (@memoized ||= Concurrent::Map.new)
				local_cache = cache[:#{method_name}] ||= Literal::LRU(Array, Literal::_Nilable(Literal::_Any)).new(#{size})
				local_cache.compute_if_absent(args) { super }
			end
		RUBY
	end

	method_name
end