|
8a9934a9
»
|
josh |
2008-07-14 |
Added Memoizable mixin for ...  |
1 |
module ActiveSupport |
|
8a87d8a6
»
|
josh |
2008-07-22 |
Improved Memoizable test co... |
2 |
module Memoizable |
| |
3 |
module Freezable |
| |
4 |
def self.included(base) |
| |
5 |
base.class_eval do |
| |
6 |
unless base.method_defined?(:freeze_without_memoizable) |
| |
7 |
alias_method_chain :freeze, :memoizable |
| |
8 |
end |
| |
9 |
end |
| |
10 |
end |
| |
11 |
|
| |
12 |
def freeze_with_memoizable |
|
3fc9a67c
»
|
jeremy |
2008-08-13 |
memoize_ and unmemoize_all |
13 |
memoize_all unless frozen? |
| |
14 |
freeze_without_memoizable |
| |
15 |
end |
| |
16 |
|
| |
17 |
def memoize_all |
| |
18 |
methods.each do |m| |
| |
19 |
if m.to_s =~ /^_unmemoized_(.*)/ |
| |
20 |
if method(m).arity == 0 |
| |
21 |
__send__($1) |
| |
22 |
else |
| |
23 |
ivar = :"@_memoized_#{$1}" |
| |
24 |
instance_variable_set(ivar, {}) |
|
a8057669
»
|
jeremy |
2008-08-07 |
Fixed memoize with punctuat... |
25 |
end |
| |
26 |
end |
| |
27 |
end |
|
3fc9a67c
»
|
jeremy |
2008-08-13 |
memoize_ and unmemoize_all |
28 |
end |
|
ae6105ef
»
|
jeremy |
2008-07-27 |
Don't rememoize if already ... |
29 |
|
|
3fc9a67c
»
|
jeremy |
2008-08-13 |
memoize_ and unmemoize_all |
30 |
def unmemoize_all |
| |
31 |
methods.each do |m| |
| |
32 |
if m.to_s =~ /^_unmemoized_(.*)/ |
| |
33 |
ivar = :"@_memoized_#{$1}" |
| |
34 |
instance_variable_get(ivar).clear if instance_variable_defined?(ivar) |
| |
35 |
end |
| |
36 |
end |
|
8a87d8a6
»
|
josh |
2008-07-22 |
Improved Memoizable test co... |
37 |
end |
| |
38 |
end |
| |
39 |
|
|
ef6f6625
»
|
josh |
2008-07-18 |
Changed ActiveSupport::Memo...  |
40 |
def memoize(*symbols) |
| |
41 |
symbols.each do |symbol| |
|
3fc9a67c
»
|
jeremy |
2008-08-13 |
memoize_ and unmemoize_all |
42 |
original_method = :"_unmemoized_#{symbol}" |
| |
43 |
memoized_ivar = :"@_memoized_#{symbol.to_s.sub(/\?\Z/, '_query').sub(/!\Z/, '_bang')}" |
|
ef6f6625
»
|
josh |
2008-07-18 |
Changed ActiveSupport::Memo...  |
44 |
|
|
8a87d8a6
»
|
josh |
2008-07-22 |
Improved Memoizable test co... |
45 |
class_eval <<-EOS, __FILE__, __LINE__ |
| |
46 |
include Freezable |
|
ef6f6625
»
|
josh |
2008-07-18 |
Changed ActiveSupport::Memo...  |
47 |
|
|
8a87d8a6
»
|
josh |
2008-07-22 |
Improved Memoizable test co... |
48 |
raise "Already memoized #{symbol}" if method_defined?(:#{original_method}) |
| |
49 |
alias #{original_method} #{symbol} |
| |
50 |
|
|
be0d235a
»
|
josh |
2008-08-06 |
Optimize memoized method if... |
51 |
if instance_method(:#{symbol}).arity == 0 |
| |
52 |
def #{symbol}(reload = false) |
|
3fc9a67c
»
|
jeremy |
2008-08-13 |
memoize_ and unmemoize_all |
53 |
if reload || !defined?(#{memoized_ivar}) || #{memoized_ivar}.empty? |
| |
54 |
#{memoized_ivar} = [#{original_method}] |
|
be0d235a
»
|
josh |
2008-08-06 |
Optimize memoized method if... |
55 |
end |
|
3fc9a67c
»
|
jeremy |
2008-08-13 |
memoize_ and unmemoize_all |
56 |
#{memoized_ivar}[0] |
|
be0d235a
»
|
josh |
2008-08-06 |
Optimize memoized method if... |
57 |
end |
| |
58 |
else |
| |
59 |
def #{symbol}(*args) |
|
3fc9a67c
»
|
jeremy |
2008-08-13 |
memoize_ and unmemoize_all |
60 |
#{memoized_ivar} ||= {} unless frozen? |
|
be0d235a
»
|
josh |
2008-08-06 |
Optimize memoized method if... |
61 |
reload = args.pop if args.last == true || args.last == :reload |
|
c609be45
»
|
josh |
2008-07-18 |
Ruby 1.9: Ensure Memoizable... |
62 |
|
|
3fc9a67c
»
|
jeremy |
2008-08-13 |
memoize_ and unmemoize_all |
63 |
if #{memoized_ivar} |
| |
64 |
if !reload && #{memoized_ivar}.has_key?(args) |
| |
65 |
#{memoized_ivar}[args] |
| |
66 |
elsif #{memoized_ivar} |
| |
67 |
#{memoized_ivar}[args] = #{original_method}(*args) |
| |
68 |
end |
|
be0d235a
»
|
josh |
2008-08-06 |
Optimize memoized method if... |
69 |
else |
|
3fc9a67c
»
|
jeremy |
2008-08-13 |
memoize_ and unmemoize_all |
70 |
#{original_method}(*args) |
|
be0d235a
»
|
josh |
2008-08-06 |
Optimize memoized method if... |
71 |
end |
|
ef6f6625
»
|
josh |
2008-07-18 |
Changed ActiveSupport::Memo...  |
72 |
end |
| |
73 |
end |
| |
74 |
EOS |
|
8a9934a9
»
|
josh |
2008-07-14 |
Added Memoizable mixin for ...  |
75 |
end |
| |
76 |
end |
| |
77 |
end |
| |
78 |
end |