memor 0.2.1 → 0.3.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/.travis.yml +2 -0
- data/Gemfile +1 -1
- data/Guardfile +1 -1
- data/README.md +17 -0
- data/lib/memor.rb +76 -58
- data/lib/memor/version.rb +1 -1
- data/memor.gemspec +1 -1
- data/spec/lib/memor_spec.rb +23 -7
- metadata +25 -11
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Guardfile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# A sample Guardfile
|
2
2
|
# More info at https://github.com/guard/guard#readme
|
3
3
|
|
4
|
-
guard 'rspec'
|
4
|
+
guard 'rspec' do
|
5
5
|
watch(%r{^spec/.+_spec\.rb$})
|
6
6
|
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
7
|
watch('spec/spec_helper.rb') { 'spec' }
|
data/README.md
CHANGED
@@ -10,6 +10,8 @@ This lib has one utility method called **memor** which takes *binding* as an
|
|
10
10
|
class Foo
|
11
11
|
include Memor
|
12
12
|
|
13
|
+
attr_accessor :age
|
14
|
+
|
13
15
|
def slow_method1
|
14
16
|
memor binding do
|
15
17
|
# slow stuff
|
@@ -27,7 +29,22 @@ This lib has one utility method called **memor** which takes *binding* as an
|
|
27
29
|
# slow stuff
|
28
30
|
end
|
29
31
|
end
|
32
|
+
|
33
|
+
def double_age
|
34
|
+
memor binding, :age do
|
35
|
+
age * 2
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
30
39
|
end
|
40
|
+
|
41
|
+
foo = Foo.new
|
42
|
+
|
43
|
+
foo.age = 2
|
44
|
+
foo.double_age # 4
|
45
|
+
|
46
|
+
foo.age = 3
|
47
|
+
foo.double_age # 6
|
31
48
|
```
|
32
49
|
|
33
50
|
Tested in ruby 1.9.2
|
data/lib/memor.rb
CHANGED
@@ -1,6 +1,79 @@
|
|
1
1
|
require 'memor/version'
|
2
2
|
|
3
3
|
module Memor
|
4
|
+
class PrivateMemoizeInstance
|
5
|
+
def initialize(the_caller, the_context_binding, explicit_dependents)
|
6
|
+
@the_caller = the_caller
|
7
|
+
@the_context_binding = the_context_binding
|
8
|
+
@explicit_dependents = explicit_dependents
|
9
|
+
end
|
10
|
+
|
11
|
+
def callee
|
12
|
+
@the_context_binding.eval '__callee__'
|
13
|
+
end
|
14
|
+
|
15
|
+
def memor_name
|
16
|
+
"@____memor_#{callee}".gsub('?', '_question_mark')
|
17
|
+
.gsub('!', '_bang')
|
18
|
+
end
|
19
|
+
|
20
|
+
def memor_method
|
21
|
+
@the_caller.method callee
|
22
|
+
end
|
23
|
+
|
24
|
+
def memoize_wrap
|
25
|
+
if memoize_lookup_key.empty?
|
26
|
+
memoize_without_dependent { yield }
|
27
|
+
|
28
|
+
else
|
29
|
+
memoize_with_dependents { yield }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def memoize_lookup_key
|
34
|
+
args_values + explicit_dependents_values
|
35
|
+
end
|
36
|
+
|
37
|
+
def explicit_dependents_values
|
38
|
+
@explicit_dependents.map do |ed_name|
|
39
|
+
@the_context_binding.eval ed_name.to_s
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def args_values
|
44
|
+
# parameters is like [[:req, :a], [:opt, :b], [:rest, :c], [:block, :d]]
|
45
|
+
value_parameters = memor_method.parameters.map do |pp|
|
46
|
+
if [:req, :rest, :opt].include? pp[0]
|
47
|
+
pp[1]
|
48
|
+
end
|
49
|
+
end.compact.map do |arg_name|
|
50
|
+
@the_context_binding.eval arg_name.to_s
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def memoize_without_dependent
|
55
|
+
unless @the_caller.instance_variable_defined? memor_name
|
56
|
+
@the_caller.instance_variable_set memor_name, yield
|
57
|
+
end
|
58
|
+
|
59
|
+
@the_caller.instance_variable_get memor_name
|
60
|
+
end
|
61
|
+
|
62
|
+
def memoize_with_dependents
|
63
|
+
unless @the_caller.instance_variable_defined? memor_name
|
64
|
+
@the_caller.instance_variable_set memor_name, {}
|
65
|
+
end
|
66
|
+
|
67
|
+
buckets = @the_caller.instance_variable_get memor_name
|
68
|
+
|
69
|
+
unless buckets.has_key?(memoize_lookup_key)
|
70
|
+
buckets[memoize_lookup_key] = yield
|
71
|
+
end
|
72
|
+
|
73
|
+
buckets[memoize_lookup_key]
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
4
77
|
|
5
78
|
private
|
6
79
|
|
@@ -22,64 +95,9 @@ private
|
|
22
95
|
# end
|
23
96
|
# end
|
24
97
|
#
|
25
|
-
def memor(context_binding)
|
26
|
-
|
27
|
-
|
28
|
-
memor_name = "@_memor_#{callee}".gsub('?', '_question_mark')
|
29
|
-
.gsub('!', '_bang')
|
30
|
-
|
31
|
-
memor_method = method(callee)
|
32
|
-
|
33
|
-
if memor_method.arity == 0 # no argument
|
34
|
-
_memor_with_no_arg(memor_name) { yield }
|
35
|
-
|
36
|
-
else
|
37
|
-
# FIXME args may be insufficient
|
38
|
-
args = _memor_args(memor_method, context_binding)
|
39
|
-
|
40
|
-
_memor_with_args(memor_name, args) { yield }
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def _memor_args(memor_method, context_binding)
|
45
|
-
arg_names = _memor_arg_names(memor_method)
|
46
|
-
|
47
|
-
arg_names.map do |arg_name|
|
48
|
-
context_binding.eval arg_name.to_s
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def _memor_arg_names(memor_method)
|
53
|
-
# parameters is like [[:req, :a], [:opt, :b], [:rest, :c], [:block, :d]]
|
54
|
-
|
55
|
-
value_parameters = memor_method.parameters.map do |pp|
|
56
|
-
if [:req, :rest, :opt].include? pp[0]
|
57
|
-
pp[1]
|
58
|
-
end
|
59
|
-
end.compact
|
60
|
-
end
|
61
|
-
|
62
|
-
def _memor_with_no_arg(memor_name)
|
63
|
-
unless instance_variable_defined? memor_name
|
64
|
-
instance_variable_set memor_name, yield
|
65
|
-
end
|
66
|
-
|
67
|
-
instance_variable_get memor_name
|
68
|
-
end
|
69
|
-
|
70
|
-
def _memor_with_args(memor_name, args)
|
71
|
-
unless instance_variable_defined? memor_name
|
72
|
-
instance_variable_set memor_name, {}
|
73
|
-
end
|
74
|
-
|
75
|
-
memor = instance_variable_get memor_name
|
76
|
-
key = [* args] # use the args array as the cache key
|
77
|
-
|
78
|
-
unless memor.has_key?(key)
|
79
|
-
memor[key] = yield
|
80
|
-
end
|
81
|
-
|
82
|
-
memor[key]
|
98
|
+
def memor(context_binding, *explicit_dependents)
|
99
|
+
PrivateMemoizeInstance.new(self, context_binding, explicit_dependents)
|
100
|
+
.memoize_wrap { yield }
|
83
101
|
end
|
84
102
|
|
85
103
|
end
|
data/lib/memor/version.rb
CHANGED
data/memor.gemspec
CHANGED
data/spec/lib/memor_spec.rb
CHANGED
@@ -23,11 +23,20 @@ describe Memor do
|
|
23
23
|
include Memor
|
24
24
|
|
25
25
|
attr_reader :slows
|
26
|
+
attr_accessor :the_explicit_depend_value
|
26
27
|
|
27
28
|
def initialize
|
28
29
|
@slows = 0
|
29
30
|
end
|
30
31
|
|
32
|
+
def explicit_depend_value
|
33
|
+
memor binding, :the_explicit_depend_value do
|
34
|
+
slow_method
|
35
|
+
|
36
|
+
the_explicit_depend_value
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
31
40
|
def no_arg
|
32
41
|
memor binding do
|
33
42
|
slow_method
|
@@ -144,17 +153,24 @@ describe Memor do
|
|
144
153
|
foo.slows.should == 1
|
145
154
|
end
|
146
155
|
|
147
|
-
it '#_memor_parameters' do
|
148
|
-
foo.send(:_memor_arg_names, foo.method(:no_arg)).should == []
|
149
|
-
foo.send(:_memor_arg_names, foo.method(:with_args1)).should == [:a, :b]
|
150
|
-
foo.send(:_memor_arg_names, foo.method(:with_args2)).should == [:args]
|
151
|
-
foo.send(:_memor_arg_names, foo.method(:with_args3)).should == [:a, :args]
|
152
|
-
end
|
153
|
-
|
154
156
|
it 'class methods' do
|
155
157
|
Bar.bar
|
156
158
|
Bar.bar.should == 'bar'
|
157
159
|
|
158
160
|
Bar.slows.should == 1
|
159
161
|
end
|
162
|
+
|
163
|
+
it 'explicit depend value' do
|
164
|
+
foo.explicit_depend_value.should == nil
|
165
|
+
foo.explicit_depend_value.should == nil
|
166
|
+
|
167
|
+
foo.slows.should == 1
|
168
|
+
|
169
|
+
foo.the_explicit_depend_value = 3
|
170
|
+
|
171
|
+
foo.explicit_depend_value.should == 3
|
172
|
+
foo.explicit_depend_value.should == 3
|
173
|
+
|
174
|
+
foo.slows.should == 2
|
175
|
+
end
|
160
176
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: memor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-07-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: guard-rspec
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '0'
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
-
requirement:
|
47
|
+
name: debugger
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ! '>='
|
@@ -43,7 +53,12 @@ dependencies:
|
|
43
53
|
version: '0'
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
47
62
|
description: memoize function without alias method chain
|
48
63
|
email:
|
49
64
|
- Aaron2Ti@gmail.com
|
@@ -83,11 +98,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
98
|
version: '0'
|
84
99
|
requirements: []
|
85
100
|
rubyforge_project: memor
|
86
|
-
rubygems_version: 1.8.
|
101
|
+
rubygems_version: 1.8.24
|
87
102
|
signing_key:
|
88
103
|
specification_version: 3
|
89
104
|
summary: simple memoize function without alias method chain
|
90
105
|
test_files:
|
91
106
|
- spec/lib/memor_spec.rb
|
92
107
|
- spec/spec_helper.rb
|
93
|
-
has_rdoc:
|