memist 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 87d64e83cf6fcd474d07bb4bd88e592620e6f888fee450da956b394cc25e9271
4
- data.tar.gz: 7465bac42705e1783047eb7962bc970cafd77a1ae163e3a36d298af15b9bf2dd
3
+ metadata.gz: 84de3c6c331c88780477146d8b16c76a692590b8f737e5500654170bbf64011d
4
+ data.tar.gz: 5628c558f0e0bbef06e3a8d6f26c206c746c99277f09f9ce22d9023adc5c0b07
5
5
  SHA512:
6
- metadata.gz: 055e3a715c240a1dbdd25d84e4a9cde9329344fb6fab22f21f7f5900fbfbc116c32a07253fe0d367aaa124a7b9efd2418809eea376874a38ecc8818314e8b659
7
- data.tar.gz: 55bc4d7837f98cfba7779f650a1695067aca9ebd288348b85c7d19156b0084573dc44421f85dd4050bdec001635775114955ed450dea0d83bb5eca30eab7021d
6
+ metadata.gz: 3eb1ea75188ba3c703d9c92ad8b19adbaee32de8085b0dad3823506e22b2370f92757df3c2136cdc8bb06b96d3b317f7d7428c9209c0db5db17b8ec3f7b168d1
7
+ data.tar.gz: ccf327df4e81b7bc905383446207f2c2fa09a6e7327081a4ba69b9c2868a7177fea8332fade6b42c138a59ad32236b9c3c4a5d423ab79307bb950d3a1928e02f
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,21 +1,38 @@
1
1
  module Memist
2
2
  module ClassMethods
3
- def memoize(method)
3
+ def memoize(method, options = {})
4
4
  if instance_method(method).arity > 1
5
5
  raise ArgumentError, "Cannot memoize `#{method}` method because it accepts more than one argument."
6
6
  end
7
7
 
8
+ if options[:depends_on].is_a?(Array)
9
+ options[:depends_on].each do |other_method|
10
+ memoization_dependencies[method.to_sym] ||= []
11
+ memoization_dependencies[method.to_sym] << other_method.to_sym
12
+ end
13
+ end
14
+
8
15
  define_method "#{method}_with_memoization" do |arg = nil|
9
16
  @memoized_values ||= Hash.new { |hash, key| hash[key] = {} }
10
17
  if @memoized_values.key?(method) && @memoized_values[method].key?(arg)
11
18
  @memoized_values[method][arg]
12
19
  else
13
- @memoized_values[method][arg] = send("#{method}_without_memoization", *arg)
20
+ value = send("#{method}_without_memoization", *arg)
21
+ @memoized_values[method][arg] = value
14
22
  end
15
23
  end
16
24
 
25
+ define_method "#{method}!" do |arg = nil|
26
+ flush_memoization(method, arg)
27
+ send("#{method}_with_memoization", *arg)
28
+ end
29
+
17
30
  alias_method "#{method}_without_memoization", method
18
31
  alias_method method, "#{method}_with_memoization"
19
32
  end
33
+
34
+ def memoization_dependencies
35
+ @memoization_dependencies ||= {}
36
+ end
20
37
  end
21
38
  end
@@ -4,16 +4,26 @@ module Memist
4
4
  return if @memoized_values.nil?
5
5
 
6
6
  if method && @memoized_values.key?(method.to_sym)
7
+ flush_memoization_dependencies(method, arg)
7
8
  if arg.nil?
8
9
  @memoized_values.delete(method.to_sym)
9
10
  else
10
11
  @memoized_values[method.to_sym].delete(arg)
11
12
  end
12
- else
13
+ elsif method.nil?
13
14
  @memoized_values = nil
14
15
  end
15
16
  end
16
17
 
18
+ def flush_memoization_dependencies(method, arg = nil)
19
+ deps = self.class.memoization_dependencies[method.to_sym]
20
+ return false if deps.nil? || deps.empty?
21
+
22
+ deps.each do |dep|
23
+ flush_memoization(dep, arg)
24
+ end
25
+ end
26
+
17
27
  def memoized?(method)
18
28
  !!(@memoized_values && @memoized_values.include?(method.to_sym))
19
29
  end
@@ -1,3 +1,3 @@
1
1
  module Memist
2
- VERSION = '2.0.0'.freeze
2
+ VERSION = '2.0.1'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: memist
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Cooke
@@ -30,7 +30,7 @@ cert_chain:
30
30
  3wUJNGnT5XYq+qvTqmjkTSTfdGvZCM63C6bGdN5CAyMokGOOatGqyCMAONolWnfC
31
31
  gm3t2GWWrxY=
32
32
  -----END CERTIFICATE-----
33
- date: 2019-10-17 00:00:00.000000000 Z
33
+ date: 2019-10-18 00:00:00.000000000 Z
34
34
  dependencies: []
35
35
  description: A Ruby Memoization Helper
36
36
  email:
metadata.gz.sig CHANGED
Binary file