sometimes_memoize 1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
|