sometimes_memoize 1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/sometimes_memoize.rb +61 -0
- 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
|
+
|