lambda_driver 1.0.0 → 1.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.
data/README.md CHANGED
@@ -43,61 +43,79 @@ Or install it yourself as:
43
43
  #### alias :< to Proc#call
44
44
 
45
45
  ```ruby
46
- f = lamdba{|x| x.to_s }
46
+ f = lambda{|x| x.to_s }
47
47
  f < :foo # => "foo"
48
48
  ```
49
49
 
50
+ #### alias :+@ to Proc#to_proc
51
+
52
+ ```ruby
53
+ +:to_s # => #<Proc:0x007ff78aadaa78>
54
+ +:to_s < :foo # => "foo"
55
+ ```
56
+
57
+
50
58
  #### Proc#compose
51
59
 
52
60
  Returns new lambda which composed self and given function.
53
61
  A composed proc called with args, executes `self.(g(*args)).
54
62
 
55
63
  ```ruby
56
- f = lamdba{|x| x.to_s }
64
+ f = lambda{|x| x.to_s * 2 }
57
65
  g = lambda{|y| y.length }
58
- h = f compose g
59
- h.(:hoge) # => 4
66
+
67
+ h = f.compose g # => #<Proc:0x007ff78aa2ab2>
68
+ h.(:hoge) # => "44" ( == f.call(g.call(:hoge)) )
60
69
  ```
61
70
 
62
71
  This method is aliased as `<<`.
63
72
 
64
73
  ```ruby
65
- f << g # => f.compose(g)
74
+ f << g # => f.compose(g)
75
+ f << g < :hoge # => "44" ( == f.call(g.call(:hoge)) )
66
76
  ```
67
77
 
68
78
  #### Proc#with_args
69
79
 
70
- Returns partially applied function that has 2nd and more parameters
80
+ Returns partially applied function that has 2nd and more parameters are
71
81
  fixed by given *args.
72
82
 
73
83
  ```ruby
74
- f = lamdba{|x, y, z| [x, y, z]}
75
- h = f.with_args(:a, :b)
76
- h.(:c) # => [:c, :a, :b]
84
+ f = lambda{|x, y, z| [x, y, z]}
85
+
86
+ h = f.with_args(:a, :b) # => #<Proc:0x007ff78a9c5ca0>
87
+ h.(:c) # => [:c, :a, :b] ( == f.call(:c, :a, :b) )
77
88
  ```
78
89
 
79
90
  This method is aliased as `*`.
80
91
 
81
92
  ```ruby
82
- f * :foo # => f.with_args(:foo)
93
+ f = lambda{|x, y| [x, y]}
94
+
95
+ f * :foo # => #<Proc:0x007ff78a987540> (== f.with_args(:foo) )
96
+ f * :foo < :bar # => [:bar, :foo] ( == f.with_args(:foo).call(:bar) )
83
97
  ```
84
98
 
85
99
 
86
100
  #### Proc#flip
87
101
 
88
- Returns function whose parameter order spawed 1st for 2nd.
102
+ Returns function whose parameter order swaped 1st for 2nd.
89
103
  A result of filped fuction is curried by Proc#curry.
90
104
 
91
105
  ```ruby
92
- f = lamdba{|x, y, z| [x, y, z]}
93
- h = f.flip
94
- h.(:a).(:b).(:c) # => [:b, :a, :c]
106
+ f = lambda{|x, y, z| [x, y, z]}
107
+
108
+ h = f.flip # => #<Proc:0x007ff78a942fa>
109
+ h.call(:a).call(:b).call(:c) # => [:b, :a, :c] (== f.curry.call(:b).call(:a).call(:b))
110
+ h < :a < :b < :c # => [:b, :a, :c] (== f.curry.call(:b).call(:a).call(:b))
95
111
  ```
96
112
 
97
113
  If arguments is var-args, pass explicitly arity to curring.
98
114
 
99
115
  ```ruby
100
116
  p = Proc.new{|*args| args.inspect }
117
+
118
+ p.arity # => -1
101
119
  p.flip(3).call(:a).(:b).(:c) # => "[:b, :a, :c]"
102
120
  p.flip(4).call(:a).(:b).(:c).(:d) # => "[:b, :a, :c, :d]"
103
121
  ```
@@ -107,11 +125,26 @@ If arity is 0 or 1, flip returns itself.
107
125
  This method is aliased as `~@`.
108
126
 
109
127
  ```ruby
110
- ~f # => f.filp
128
+ ~f # => #<Proc:0x007ff78a8e22c> (== f.filp)
129
+ ~f < :a < :b < :c # => [:b, :a, :c] (== f.filp.call(:b).call(:a).call(:b))
130
+
111
131
  ```
112
132
 
113
- <!-- Symbol extensions -->
114
- <!-- - to_method -->
133
+ ### Symbol extensions
134
+ - to_method
135
+
136
+ #### Symbol#to_method
137
+
138
+ Symbol#to_method generates a function that extract Method object from given arguments.
139
+ This method is aliased as `-@`.
140
+
141
+ ```ruby
142
+ (-:index).call("foobarbaz") # => #<Method: String#index>
143
+ (-:index).call("foobarbaz").call("bar") # => 3 (== "foobarbaz".index(3) )
144
+
145
+ -:index < "foobarbaz" # => #<Method: String#index>
146
+ -:index < "foobarbaz" < "bar" # => 3 (== "foobarbaz".index(3) )
147
+ ```
115
148
 
116
149
  ### Class extensions
117
150
  - alias instance_method, :/
@@ -134,32 +167,43 @@ This method is aliased as `~@`.
134
167
  - ski combinator
135
168
 
136
169
  ### Object extensions
137
- - ap(|>) : obj.ap(f) => f.call(obj)
138
- - obj._.method : returns obj.method(method) or lamdba{|*args| obj.send(method, *args) }
139
- <!-- - obj.disjunction(f) : if f(self) is nil, return self else return f(self) -->
170
+ - obj.ap(|>)
171
+ - obj._
172
+ - obj.disjunction(f)
140
173
 
141
- #### Object#ap
174
+ #### Object#revapply
142
175
 
143
- `Object#ap` is applies self to given proc/block.
176
+ `Object#revapply` is applies self to given proc/block.
144
177
 
145
178
  ```ruby
146
179
  f = lambda{|x| x * 2 }
147
- "foo".ap(f) # => "fooffoo"
180
+
181
+ "foo".revapply(f) # => "fooffoo" (== f.call("foo") )
148
182
  ```
149
183
 
150
184
  #### Object#_
151
185
 
152
- Object#op is shortcut to quickly extract Method object.
186
+ Object#_ is shortcut to quickly extract Method object.
153
187
 
154
188
  ```ruby
155
- "foobarbaz"._.index #=> #<Method: String#index>
189
+ "foobarbaz"._.index # => #<Method: String#index>
156
190
  "foobarbaz"._.index < "bar" # => 3 (== "foobarbaz".index(3) )
157
191
 
158
- 2._(:>=) # => #<Method: Fixnum#>=>
192
+ 2._(:>=) # => #<Method: Fixnum#>=>
159
193
  [1, 2, 3].select(&2._(:>=)) # => [1, 2]( = [1, 2].select{|n| 2 >= n})
160
194
  ```
161
195
 
196
+ #### Object#disjunction
197
+
198
+ `Object#disjunction` select self or result of applied self to given function.
199
+ if f(self) is nil, returns self, otherwise return f(self).
162
200
 
201
+ ```ruby
202
+ f = lambda{|x| x % 2 == 0 ? nil : x * 2}
203
+
204
+ 2.disjunction(f) # => 2 (disjunction returns reciever object)
205
+ 3.disjunction(f) # => 6 (disjunction returns f(3) )
206
+ ```
163
207
 
164
208
  ## Contributing
165
209
 
@@ -1,4 +1,5 @@
1
1
  class Object
2
2
  include LambdaDriver::Op::Proxy
3
- include LambdaDriver::Ap
3
+ include LambdaDriver::Revapply
4
+ include LambdaDriver::Disjunction
4
5
  end
@@ -1,4 +1,10 @@
1
1
  class Symbol
2
2
  include LambdaDriver::Callable
3
3
  include LambdaDriver::Currying if RUBY_VERSION < '1.9.0'
4
+
5
+ def to_method
6
+ lambda{|obj| obj._(self) }
7
+ end
8
+
9
+ alias_method :-@, :to_method
4
10
  end
@@ -0,0 +1,9 @@
1
+ module LambdaDriver::Disjunction
2
+ def disjunction(f = nil, &block)
3
+ if f.nil? && (not block_given?)
4
+ return lambda{|g=nil,&inner_block| self.disjunction(g, &inner_block) }
5
+ end
6
+
7
+ (block_given? ? (yield self) : f.call(self)) || self
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module LambdaDriver::Revapply
2
+ def revapply(f = nil, &block)
3
+ if f.nil? && (not block_given?)
4
+ return lambda{|g=nil,&inner_block| self.revapply(g, &inner_block) }
5
+ end
6
+
7
+ block_given? ? (yield self) : f.call(self)
8
+ end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module LambdaDriver
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+
3
+ describe LambdaDriver::Disjunction do
4
+ let(:obj) { "foobarbaz" }
5
+ let(:f) { lambda{|x| x * 2 } }
6
+
7
+ describe '#disjunction'do
8
+ context 'f(obj) returns nil' do
9
+ context 'given none' do
10
+ subject { obj.disjunction }
11
+
12
+ it { should be_a_kind_of Proc }
13
+
14
+ it('obj.disjunction.call(f) should be obj'){
15
+ subject.call(lambda{|x| nil}).should == obj
16
+ }
17
+ it('obj.disjunction.call{block} should be obj'){
18
+ subject.call{nil}.should == obj
19
+ }
20
+ it('obj.disjunction.call(f){block} should obj'){
21
+ subject.call(f){nil}.should == obj
22
+ }
23
+ end
24
+
25
+ context 'block given' do
26
+ it('obj.disjunction{block} should be result of execute block with obj'){
27
+ obj.disjunction{nil}.should == obj
28
+ }
29
+ end
30
+
31
+ context 'proc object given' do
32
+ it('obj.ap(f) should be f.call(obj)'){
33
+ obj.disjunction(lambda{|x| nil}).should == obj
34
+ }
35
+ end
36
+
37
+ context 'block given and proc object given' do
38
+ it('obj.ap.call(f){block} should be result of execute block with obj'){
39
+ obj.disjunction(f){nil}.should == obj
40
+ }
41
+ end
42
+ end
43
+
44
+ context 'f(obj) does not returns nil' do
45
+ context 'given none' do
46
+ subject { obj.disjunction }
47
+
48
+ it { should be_a_kind_of Proc }
49
+
50
+ it('obj.disjunction.call(f) should be obj'){
51
+ subject.call(f).should == f.call(obj)
52
+ }
53
+ it('obj.disjunction.call{block} should be result of execute block with obj'){
54
+ subject.call{|x| x * 3 }.should == obj * 3
55
+ }
56
+ it('obj.disjunction.call(f){block} should be result of execute block with obj'){
57
+ subject.call(f){|x| x * 3 }.should == obj * 3
58
+ }
59
+ end
60
+
61
+ context 'block given' do
62
+ it('obj.disjunction{block} should be result of execute block with obj'){
63
+ obj.disjunction{|x| x * 3 }.should == (obj * 3)
64
+ }
65
+ end
66
+
67
+ context 'proc object given' do
68
+ it('obj.ap(f) should be f.call(obj)'){
69
+ obj.disjunction(f).should == f.call(obj)
70
+ }
71
+ end
72
+
73
+ context 'block given and proc object given' do
74
+ it('obj.ap.call(f){block} should be result of execute block with obj'){
75
+ obj.disjunction(f){|x| x * 3 }.should == (obj * 3)
76
+ }
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe LambdaDriver::Revapply do
4
+ let(:object) { "foobarbaz" }
5
+ let(:f) { lambda{|x| x * 2 } }
6
+
7
+ describe '#revapply'do
8
+ context 'given none' do
9
+ subject { object.revapply }
10
+
11
+ it { should be_a_kind_of Proc }
12
+ it('obj.revapply.call(f) should be f.call(obj)'){
13
+ subject.call(f).should == f.call(object)
14
+ }
15
+ it('obj.revapply.call{block} should be result of execute block with obj'){
16
+ subject.call{|x| x * 3 }.should == (object * 3)
17
+ }
18
+ it('obj.revapply.call(f){block} should be result of execute block with obj'){
19
+ subject.call(f){|x| x * 3 }.should == (object * 3)
20
+ }
21
+ end
22
+
23
+ context 'block given' do
24
+ it('obj.revapply{block} should be result of execute block with obj'){
25
+ object.revapply{|x| x * 3 }.should == (object * 3)
26
+ }
27
+ end
28
+
29
+ context 'proc object given' do
30
+ it('obj.revapply(f) should be f.call(obj)'){
31
+ object.revapply(f).should == f.call(object)
32
+ }
33
+ end
34
+
35
+ context 'block given and proc object given' do
36
+ it('obj.revapply.call(f){block} should be result of execute block with obj'){
37
+ object.revapply(f){|x| x * 3 }.should == (object * 3)
38
+ }
39
+ end
40
+ end
41
+ end
data/spec/symbol_spec.rb CHANGED
@@ -55,9 +55,32 @@ describe Symbol do
55
55
  it_should_behave_like 'aliases'
56
56
 
57
57
  it_should_behave_like 'aliases(varargs)' do
58
- subject { :product }
59
- let(:x) { [:bar] }
60
- let(:y) { [:foo] }
58
+ subject { :delete}
59
+ let(:x) { :bar }
60
+ let(:y) { 'a' }
61
61
  end
62
62
  end
63
+
64
+ describe '#to_method' do
65
+ subject { :index.to_method }
66
+
67
+ let(:obj) { "foobarbaz" }
68
+
69
+ it { should be_a_kind_of Proc }
70
+ it('symbol.to_method.call(obj) should returns Method'){
71
+ subject.call(obj).should be_a_kind_of Method
72
+ }
73
+
74
+ it('symbol.to_method.call(obj).call(x) should be obj.method(symbol).call(x)'){
75
+ subject.call(obj).call("bar").should == obj.method(:index).call("bar")
76
+ }
77
+
78
+ it('-:symbol.to_method.call(obj) should returns Method'){
79
+ (-:index).call(obj).should be_a_kind_of Method
80
+ }
81
+
82
+ it('-:symbol.to_method.call(obj).call(x) should be obj.method(symbol).call(x)'){
83
+ (-:index).call(obj).call("bar").should == obj.method(:index).call("bar")
84
+ }
85
+ end
63
86
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lambda_driver
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.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: 2013-03-26 00:00:00.000000000Z
12
+ date: 2013-03-27 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70364479275960 !ruby/object:Gem::Requirement
16
+ requirement: &70294430507480 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70364479275960
24
+ version_requirements: *70294430507480
25
25
  description: Drives your code more functioal!
26
26
  email:
27
27
  - ozaki@yuroyoro.com
@@ -37,7 +37,6 @@ files:
37
37
  - Rakefile
38
38
  - lambda_driver.gemspec
39
39
  - lib/lambda_driver.rb
40
- - lib/lambda_driver/ap.rb
41
40
  - lib/lambda_driver/callable.rb
42
41
  - lib/lambda_driver/core_ext.rb
43
42
  - lib/lambda_driver/core_ext/class.rb
@@ -47,14 +46,17 @@ files:
47
46
  - lib/lambda_driver/core_ext/symbol.rb
48
47
  - lib/lambda_driver/core_ext/unbound_method.rb
49
48
  - lib/lambda_driver/currying.rb
49
+ - lib/lambda_driver/disjunction.rb
50
50
  - lib/lambda_driver/op.rb
51
+ - lib/lambda_driver/revapply.rb
51
52
  - lib/lambda_driver/version.rb
52
- - spec/ap_spec.rb
53
53
  - spec/class_spec.rb
54
+ - spec/disjunction_spec.rb
54
55
  - spec/lambda_spec.rb
55
56
  - spec/method_spec.rb
56
57
  - spec/op_spec.rb
57
58
  - spec/proc_spec.rb
59
+ - spec/revapply_spec.rb
58
60
  - spec/shared/composable_spec.rb
59
61
  - spec/spec_helper.rb
60
62
  - spec/symbol_spec.rb
@@ -84,12 +86,13 @@ signing_key:
84
86
  specification_version: 3
85
87
  summary: Drives your code more functioal!
86
88
  test_files:
87
- - spec/ap_spec.rb
88
89
  - spec/class_spec.rb
90
+ - spec/disjunction_spec.rb
89
91
  - spec/lambda_spec.rb
90
92
  - spec/method_spec.rb
91
93
  - spec/op_spec.rb
92
94
  - spec/proc_spec.rb
95
+ - spec/revapply_spec.rb
93
96
  - spec/shared/composable_spec.rb
94
97
  - spec/spec_helper.rb
95
98
  - spec/symbol_spec.rb
@@ -1,13 +0,0 @@
1
- module LambdaDriver::Ap
2
- def ap(f = nil, &block)
3
- if f.nil? && (not block_given?)
4
- return lambda{|g=nil,&inner_block| self.ap(g, &inner_block) }
5
- end
6
-
7
- if block_given?
8
- yield self
9
- else
10
- f.call(self)
11
- end
12
- end
13
- end
data/spec/ap_spec.rb DELETED
@@ -1,41 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe LambdaDriver::Ap do
4
- let(:object) { "foobarbaz" }
5
- let(:f) { lambda{|x| x * 2 } }
6
-
7
- describe '#ap'do
8
- context 'given none' do
9
- subject { object.ap }
10
-
11
- it { should be_a_kind_of Proc }
12
- it('obj.ap.call(f) should be f.call(obj)'){
13
- subject.call(f).should == f.call(object)
14
- }
15
- it('obj.ap.call{block} should be result of execute block with obj'){
16
- subject.call{|x| x * 3 }.should == (object * 3)
17
- }
18
- it('obj.ap.call(f){block} should be result of execute block with obj'){
19
- subject.call(f){|x| x * 3 }.should == (object * 3)
20
- }
21
- end
22
-
23
- context 'block given' do
24
- it('obj.ap{block} should be result of execute block with obj'){
25
- object.ap{|x| x * 3 }.should == (object * 3)
26
- }
27
- end
28
-
29
- context 'proc object given' do
30
- it('obj.ap(f) should be f.call(obj)'){
31
- object.ap(f).should == f.call(object)
32
- }
33
- end
34
-
35
- context 'block given and proc object given' do
36
- it('obj.ap.call(f){block} should be result of execute block with obj'){
37
- object.ap(f){|x| x * 3 }.should == (object * 3)
38
- }
39
- end
40
- end
41
- end