sometimes_memoize 1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/sometimes_memoize.rb +61 -0
  2. metadata +63 -0
@@ -0,0 +1,61 @@
1
+ module SometimesMemoize
2
+
3
+ VERSION = '1.0'
4
+
5
+ module ClassMethods
6
+
7
+ def sometimes_memoized_instance_variable_names
8
+ @sometimes_memoized_instance_variable_names ||= []
9
+ end
10
+
11
+ def sometimes_memoize(method_name)
12
+ original_method_name = "#{method_name}_unmemoized"
13
+ alias_method original_method_name, method_name
14
+ self.sometimes_memoized_instance_variable_names << method_name
15
+ define_method method_name do
16
+ if self.currently_memoizing?
17
+ if (val = self.instance_variable_get("@#{method_name}")).nil?
18
+ val = self.send(original_method_name)
19
+ self.instance_variable_set("@#{method_name}", val)
20
+ end
21
+ val
22
+ else
23
+ self.send(original_method_name)
24
+ end
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+ def self.included(base)
31
+ base.extend(ClassMethods)
32
+ end
33
+
34
+ def memoizing
35
+ @currently_memoizing = true
36
+ begin
37
+ yield
38
+ ensure
39
+ @currently_memoizing = false
40
+ self.class.sometimes_memoized_instance_variable_names.each{|mn| self.instance_variable_set("@#{mn}", nil)}
41
+ end
42
+ end
43
+
44
+ def currently_memoizing?
45
+ !!@currently_memoizing
46
+ end
47
+
48
+ def sometimes_memoizing(instance_variable_name)
49
+ self.class.sometimes_memoized_instance_variable_names << instance_variable_name
50
+ if self.currently_memoizing?
51
+ if (val = self.instance_variable_get("@#{instance_variable_name}")).nil?
52
+ val = yield
53
+ self.instance_variable_set("@#{instance_variable_name}", val)
54
+ end
55
+ val
56
+ else
57
+ yield
58
+ end
59
+ end
60
+
61
+ end
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sometimes_memoize
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 0
8
+ version: "1.0"
9
+ platform: ruby
10
+ authors:
11
+ - Ben Lund
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+
16
+ date: 2011-05-02 00:00:00 +01:00
17
+ default_executable:
18
+ dependencies: []
19
+
20
+ description: A small library that memoizes method calls or code blocks for the duration of a block call only.
21
+ email: ben@benlund.com
22
+ executables: []
23
+
24
+ extensions: []
25
+
26
+ extra_rdoc_files: []
27
+
28
+ files:
29
+ - lib/sometimes_memoize.rb
30
+ has_rdoc: true
31
+ homepage: http://github.com/benlund/sometimes_memoize
32
+ licenses: []
33
+
34
+ post_install_message:
35
+ rdoc_options: []
36
+
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ segments:
53
+ - 0
54
+ version: "0"
55
+ requirements: []
56
+
57
+ rubyforge_project:
58
+ rubygems_version: 1.3.7
59
+ signing_key:
60
+ specification_version: 3
61
+ summary: A small library that memoizes method calls or code blocks for the duration of a block call only. Easily turn memoizing on and off. Memoized values are forgotten after it's turned off. Annotate existing methods as sometimes memoized. Wrap code blocks and sometimes memoize the result
62
+ test_files: []
63
+