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 +7 -0
- data/lib/fond_memos.rb +85 -0
- data/lib/fond_memos/version.rb +3 -0
- metadata +101 -0
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
|
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: []
|