fond_memos 0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fab41ba233662d68f3dc0e9cea0a29b691e5efec
4
+ data.tar.gz: 8112df52db2be08a8b591b98609f6fd47077dcd6
5
+ SHA512:
6
+ metadata.gz: ff99433ecdf8520d0b7d19e5bd55604af60a1ad967384e633fb8828e40f29f0d4372e3c498c7f7b54e6026297a62f2dd4dffca1257242ed583f6e94d76b574cc
7
+ data.tar.gz: 2e3deafa27a396e5022dd61570ae30e8bd217fd3a946962ca88f0f3c243f70317bfaf4f90a75fec8d1991f1268c6ee82e4fa82e5c6c8c02f663efd0636b8656e
data/lib/fond_memos.rb ADDED
@@ -0,0 +1,85 @@
1
+ require 'fond_memos/version'
2
+
3
+ # Include this module in classes that have methods you want to memoize. It is
4
+ # very simple, so skim through the code before you use it just to feel extra
5
+ # secure in using it, and also to help me find any bugs.
6
+ #
7
+ # Eg:
8
+ #
9
+ # Class Foo
10
+ # include FondMemos
11
+ #
12
+ # def bar
13
+ # # expensive calculation
14
+ # end
15
+ # memoize :bar
16
+ # end
17
+
18
+ # foo = Foo.new
19
+ # foo.bar # expensive
20
+ # foo.bar # fast
21
+ # foo.forget(:bar)
22
+ # foo.bar # expensive again (why did you forget?)
23
+ # foo.bar # fast again (that's better)
24
+ #
25
+ # If you memoize a method with arguments, the #hash method will be called on
26
+ # each argument to generate a key to use in FondMemo's internal hash.
27
+ # To ensure safe and responsible memoizing, it is strongly encouraged to ensure
28
+ # your memoized method arguments have logical hash values.
29
+ #
30
+ # May you always have fond memos of using this gem!
31
+ module FondMemos
32
+ def self.included(base)
33
+ base.extend ClassMethods
34
+ end
35
+
36
+ # Calling this will remove the caching instance variable for the method.
37
+ # In the case of multi argument methods, all values will be forgotten.
38
+ # @param method [Symbol] the method to forget
39
+ def forget(method)
40
+ remove_instance_variable(Internal.var_name(method))
41
+ end
42
+
43
+ private
44
+
45
+ def _fond_fetch(var_name, original_method)
46
+ return instance_variable_get(var_name) if instance_variable_defined?(var_name)
47
+ instance_variable_set(var_name, original_method.bind(self).call)
48
+ end
49
+
50
+ def _fond_multi_fetch(var_name, original_method, args)
51
+ instance_variable_set(var_name, {}) unless instance_variable_defined?(var_name)
52
+ hash = instance_variable_get(var_name)
53
+ key = args.map(&:hash)
54
+ if hash.key?(key)
55
+ hash[key]
56
+ else
57
+ hash[key] = original_method.bind(self).call(*args)
58
+ end
59
+ end
60
+
61
+ #:nodoc:
62
+ module ClassMethods
63
+ # Add memoization for the listed methods
64
+ # @param methods [Array<Symbol>] the methods to memoize
65
+ def memoize(*methods)
66
+ methods.each do |m|
67
+ original_method = instance_method(m)
68
+ var_name = Internal.var_name(original_method.name)
69
+ undef_method(m)
70
+ if original_method.arity.zero?
71
+ define_method(m) { _fond_fetch(var_name, original_method) }
72
+ else
73
+ define_method(m) { |*args| _fond_multi_fetch(var_name, original_method, args) }
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ #:nodoc:
80
+ module Internal
81
+ def self.var_name(method)
82
+ "@memoized_#{method}".to_sym
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,3 @@
1
+ module FondMemos
2
+ VERSION = '0.1.0'.freeze
3
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fond_memos
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Matt Clark
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-06-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.12'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.12.5
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.12'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.12.5
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '11.1'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 11.1.2
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '11.1'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 11.1.2
53
+ - !ruby/object:Gem::Dependency
54
+ name: minitest
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '5.9'
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '5.9'
67
+ description: Memoization so simple you could have written it. But I did, so you don't
68
+ have to.
69
+ email:
70
+ - matt.clark.1@gmail.com
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - lib/fond_memos.rb
76
+ - lib/fond_memos/version.rb
77
+ homepage: https://github.com/mclark/fond_memos
78
+ licenses:
79
+ - MIT
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubyforge_project:
97
+ rubygems_version: 2.5.1
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: Simple, effective memoization.
101
+ test_files: []