inverse_methods 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b107057c14015315b7c09b3d9c342f848b50eb57
4
- data.tar.gz: ed2ed1c3b559bdb011d15841d1040b95b2236b13
3
+ metadata.gz: 3a00cfd4c5c28a08d41837a2281cd898397de830
4
+ data.tar.gz: 57b9ef38aa446c7b34cafb8ddabd7085295ad30e
5
5
  SHA512:
6
- metadata.gz: '0702282f19a800fe6ce2d0cb3dccfac7c16ab26fcc113828932de87fb81b00ca25aadf6d52ce7ad3642e99d97852033b083294037e9e8aecbc109c8ae5d82fdd'
7
- data.tar.gz: dff2fcb76a39d5d6e63748c5465d171dd0241d8ea23a5bfa7692beb0f2f50501d833979dcf50112a4a78400fd91ff8484223f93f9b9c91af1c8e1bdfdce3ff18
6
+ metadata.gz: 0f21f8419c2e40b9bd5bccd0584dfb942b59ca41f14023297a00ec3bda19aaf96113a19e64df3fe3480c6490baa4f3ec4741937df6fb37f412971ab4cbd87ef3
7
+ data.tar.gz: 7bc2cd0367f58c1ed88872c58993ec258eecfdef9383b89a86887a4473eb921a6fc63e2a2a7dc8dc666f384c00a84246fa5106bfce39a7577a0e36148b3b5ea4
@@ -8,13 +8,16 @@ EvalProc = ->(sym, argument, context){
8
8
  module InverseMethods
9
9
 
10
10
  def pass_to(*syms)
11
+ syms = syms[0] if syms[0].is_a?(Array)
11
12
  RubyVM::DebugInspector.open { |inspector|
12
13
  caller_context = inspector.frame_binding(2)
13
14
  syms.each { |sym| EvalProc.call(sym, self, caller_context) }
14
15
  }
16
+ self
15
17
  end
16
18
 
17
19
  def chain_to(*syms)
20
+ syms = syms[0] if syms[0].is_a?(Array)
18
21
  RubyVM::DebugInspector.open { |inspector|
19
22
  caller_context = inspector.frame_binding(2)
20
23
  initial_result = EvalProc.call syms.shift, self, caller_context
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module InverseMethods
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
data/readme.md CHANGED
@@ -1,3 +1,18 @@
1
+ ### Install
2
+
3
+ `gem install inverse_methods`
4
+ `require 'inverse_methods'`
5
+
6
+ ## Accessing methods
7
+
8
+ There is a single module `InverseMethods` which can be included where it's needed or patched on `Object` for global access.
9
+
10
+ To load it globally, use `Object.include InverseMethods`. Or use a more specific scope such as `MyClass.include InverseMethods` or `MyClass.extend InverseMethods`.
11
+
12
+ It can be used as a refinement: `using InverseMethods`.
13
+
14
+ ### Explanation
15
+
1
16
  Two methods which can be added on Object:
2
17
 
3
18
  Both use `debug_inspector` to do some stuff with Ruby that wouldn't otherwise be possible.
@@ -5,15 +20,18 @@ Both use `debug_inspector` to do some stuff with Ruby that wouldn't otherwise be
5
20
  `pass_to` is kind of like a reverse tap. It still works as a "tap" (it returns the caller) but takes arguments differently:
6
21
 
7
22
  foo = []
8
- 1.pass_to *%i{ foo.push foo.push }
23
+ 1.pass_to %i{ foo.push foo.push }
24
+ # => 1
9
25
  puts foo # => [1,1]
10
26
 
11
27
  The caller is being passed as an argument (serialized using `Marshal.dump`), and the symbols in the list are methods which it is passed to. They are evaluated in the caller context, which is why the local variable `foo` can be referenced.
12
28
 
29
+ The method names passed to `pass_to` are not chained. This is why `[1,1]` was returned instead of `[1, [...]]` (the three dots being a recursive reference). The `foo.push 1` calls happen independently of one another.
30
+
13
31
  The above example, if modified like so, wouldn't work:
14
32
 
15
33
  foo = []
16
- 1.pass_to :foo.push :foo.push
34
+ 1.pass_to [:foo.push, :foo.push]
17
35
  puts foo
18
36
 
19
37
  The reason is that `:foo.push` is a `SyntaxError`. It needs to be written as `:"foo.push"`, which the `%i{ array.of symbols }` shorthand would do automatically.
@@ -21,7 +39,7 @@ The reason is that `:foo.push` is a `SyntaxError`. It needs to be written as `:"
21
39
  The second method is `chain_to`, which is perhaps the 'functional programming' alternative to `pass_to` (and `tap`, which it's based on). It works similarly:
22
40
 
23
41
  foo = []
24
- [1].chain_to *%i{[0].concat [2].concat}
25
- puts foo # => [0,1,2]
42
+ [1].chain_to %i{[2].concat [3].concat}
43
+ puts foo # => [3,2,1]
26
44
 
27
- Only the first symbol (`:"[].concat"`) gets the original argument, `[1]`, passed when evaluated. The next symbol `:"[2].concat"` gets the first evaluation's result (`[0, 1]`) passed.
45
+ Only the first symbol (`:"[2].concat"`) gets the original argument, `[1]`, passed when evaluated. The next symbol `:"[3].concat"` gets the first evaluation's result (`[2, 1]`) passed.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inverse_methods
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - maxpleaner
@@ -55,7 +55,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
55
55
  version: 2.5.1
56
56
  requirements: []
57
57
  rubyforge_project:
58
- rubygems_version: 2.5.1
58
+ rubygems_version: 2.6.11
59
59
  signing_key:
60
60
  specification_version: 4
61
61
  summary: two added methods on Object