lambda_driver 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -17,3 +17,4 @@ test/version_tmp
17
17
  tmp
18
18
  vendor/
19
19
  .rbenv-version
20
+ .ruby-version
data/.travis.yml CHANGED
@@ -1,6 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 1.8.7
4
- - 1.9.2
5
4
  - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.0
6
7
  script: bundle exec rspec spec
data/README.md CHANGED
@@ -82,6 +82,31 @@ This method is aliased as `<<`.
82
82
  f << g < :hoge # => "44" ( == f.call(g.call(:hoge)) )
83
83
  ```
84
84
 
85
+
86
+ #### Proc#compose_with_lifting
87
+
88
+ compose self and give fuction with checking g(x) is mzero.
89
+ if g(x) is mzero, it does not call self and return g(x),
90
+ otherwise returns f(g(x)).
91
+
92
+ mzero means the object is nil or emtpy
93
+
94
+ ```ruby
95
+ hash = {:a => "foo"}
96
+ f = lambda{|y| y.length }
97
+ g = lambda{|y| hash[y]}
98
+ h = f.compose_with_lifting g
99
+ h.(:a) # => 3
100
+ h.(:b) # => nil (it does not called f)
101
+ ```
102
+
103
+ This method is aliased as `<=`.
104
+
105
+ ```ruby
106
+ f <= g # => f.compose_with_lifting(g)
107
+ ```
108
+
109
+
85
110
  #### Proc#with_args
86
111
 
87
112
  Returns partially applied function that has 2nd and more parameters are
@@ -1,4 +1,5 @@
1
1
  class Method
2
2
  include LambdaDriver::Callable
3
3
  include LambdaDriver::Currying if RUBY_VERSION < '1.9.0'
4
+ include LambdaDriver::Liftable
4
5
  end
@@ -2,4 +2,5 @@ class Object
2
2
  include LambdaDriver::Op::Proxy
3
3
  include LambdaDriver::Revapply
4
4
  include LambdaDriver::Disjunction
5
+ include LambdaDriver::Mzero
5
6
  end
@@ -1,4 +1,5 @@
1
1
  class Proc
2
2
  include LambdaDriver::Callable
3
3
  include LambdaDriver::Currying if RUBY_VERSION < '1.9.0'
4
+ include LambdaDriver::Liftable
4
5
  end
@@ -0,0 +1,35 @@
1
+ module LambdaDriver::Liftable
2
+
3
+ # compose self and give fuction with checking g(x) is mzero.
4
+ # if g(x) is mzero, it does not call self and return g(x),
5
+ # otherwise returns f(g(x)).
6
+ #
7
+ # mzero means the object is nil or emtpy
8
+ #
9
+ # hash = {:a => "foo"}
10
+ # f = lambda{|y| y.length }
11
+ # g = lambda{|y| hash[y]}
12
+ # h = f.compose_with_lifting g
13
+ # h.(:a) # => 3
14
+ # h.(:b) # => nil (it does not called f)
15
+ #
16
+ # This method is aliased as `<=`.
17
+ #
18
+ # f <= g # => f.compose_with_lifting(g)
19
+ #
20
+ def compose_with_lifting(g)
21
+ lambda{|*args|
22
+ result = g.to_proc.call(*args)
23
+ mzero_method = result.respond_to?(:mzero?) ? :mzero? : :nil?
24
+ result.send(mzero_method) ? result : self.to_proc.call(result)
25
+ }
26
+ end
27
+
28
+ def >=(g)
29
+ g.to_proc <= self
30
+ end
31
+
32
+ def self.included(klass)
33
+ klass.send(:alias_method, :<=, :compose_with_lifting)
34
+ end
35
+ end
@@ -0,0 +1,6 @@
1
+ module LambdaDriver::Mzero
2
+ def mzero?
3
+ mzero_method = self.respond_to?(:empty?) ? :empty? : :nil?
4
+ self.send(mzero_method)
5
+ end
6
+ end
@@ -1,3 +1,3 @@
1
1
  module LambdaDriver
2
- VERSION = "1.1.2"
2
+ VERSION = "1.2.0"
3
3
  end
data/spec/lambda_spec.rb CHANGED
@@ -7,6 +7,12 @@ describe 'lambda' do
7
7
  it_should_behave_like 'composable'
8
8
  end
9
9
 
10
+ describe '#compose_with_lifting' do
11
+ subject { lambda{|x| x.mzero? ? x : x.to_s} }
12
+
13
+ it_should_behave_like 'liftable'
14
+ end
15
+
10
16
  describe '#with_args' do
11
17
  subject { lambda{|x, y, *z| [x, y] + z.to_a } }
12
18
  it_should_behave_like 'with_args'
data/spec/proc_spec.rb CHANGED
@@ -7,6 +7,12 @@ describe Proc do
7
7
  it_should_behave_like 'composable'
8
8
  end
9
9
 
10
+ describe '#compose_with_lifting' do
11
+ subject { Proc.new{|x| x.mzero? ? x : x.to_s} }
12
+
13
+ it_should_behave_like 'liftable'
14
+ end
15
+
10
16
  describe '#with_args' do
11
17
  subject { Proc.new{|x, y, *z| [x, y] + z.to_a } }
12
18
  it_should_behave_like 'with_args'
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'liftable' do
4
+ it { should respond_to :compose_with_lifting }
5
+ it { should respond_to :>= }
6
+ it { should respond_to :<= }
7
+
8
+ let(:x) { :foo }
9
+ let(:y) { [1,2] }
10
+ let(:z) { {:a => 1, :b => 2} }
11
+ let(:g) { lambda{|x|
12
+ if x.nil? || (x.respond_to?(:empty?) && x.empty?)
13
+ raise "g called with nil arg"
14
+ else
15
+ (x.to_s * 2) + "_g"
16
+ end
17
+ }
18
+ }
19
+
20
+ it('" f >= g" returns function that does not call g if args is mzero'){
21
+ (subject >= g).should be_a_kind_of Proc
22
+ }
23
+
24
+ it('"(f >= g).call(nil) returns nil and does not call g'){
25
+ (subject >= g).call(nil).should be_nil
26
+ }
27
+ it('"(f >= g).call(x) should be g(f(x))'){
28
+ (subject >= g).call(x).should == g.call(subject.to_proc.call(x))
29
+ }
30
+ it('"(f >= g).call([]) returns [] and does not call g'){
31
+ (subject >= g).call([]).should == []
32
+ }
33
+ it('"(f >= g).call([1,2]) should be g(f([1,2]))'){
34
+ (subject >= g).call(y).should == g.call(subject.to_proc.call(y))
35
+ }
36
+ it('"(f >= g).call({}) returns {} and does not call g'){
37
+ (subject >= g).call({}).should == {}
38
+ }
39
+ it('"(f >= g).call({:a => 1,:b => 2}) should be g(f({:a => 1, :b => 2}))'){
40
+ (subject >= g).call(z).should == g.call(subject.to_proc.call(z))
41
+ }
42
+
43
+ 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.1.2
4
+ version: 1.2.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-27 00:00:00.000000000Z
12
+ date: 2014-01-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70302147613760 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,12 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70302147613760
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  description: Drives your code more functioal!
26
31
  email:
27
32
  - ozaki@yuroyoro.com
@@ -48,6 +53,8 @@ files:
48
53
  - lib/lambda_driver/core_ext/unbound_method.rb
49
54
  - lib/lambda_driver/currying.rb
50
55
  - lib/lambda_driver/disjunction.rb
56
+ - lib/lambda_driver/liftable.rb
57
+ - lib/lambda_driver/mzero.rb
51
58
  - lib/lambda_driver/op.rb
52
59
  - lib/lambda_driver/revapply.rb
53
60
  - lib/lambda_driver/version.rb
@@ -59,6 +66,7 @@ files:
59
66
  - spec/proc_spec.rb
60
67
  - spec/revapply_spec.rb
61
68
  - spec/shared/composable_spec.rb
69
+ - spec/shared/liftable.rb
62
70
  - spec/spec_helper.rb
63
71
  - spec/symbol_spec.rb
64
72
  - spec/unbound_method_spec.rb
@@ -74,15 +82,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
74
82
  - - ! '>='
75
83
  - !ruby/object:Gem::Version
76
84
  version: '0'
85
+ segments:
86
+ - 0
87
+ hash: -920517596245893888
77
88
  required_rubygems_version: !ruby/object:Gem::Requirement
78
89
  none: false
79
90
  requirements:
80
91
  - - ! '>='
81
92
  - !ruby/object:Gem::Version
82
93
  version: '0'
94
+ segments:
95
+ - 0
96
+ hash: -920517596245893888
83
97
  requirements: []
84
98
  rubyforge_project:
85
- rubygems_version: 1.8.10
99
+ rubygems_version: 1.8.23
86
100
  signing_key:
87
101
  specification_version: 3
88
102
  summary: Drives your code more functioal!
@@ -95,6 +109,7 @@ test_files:
95
109
  - spec/proc_spec.rb
96
110
  - spec/revapply_spec.rb
97
111
  - spec/shared/composable_spec.rb
112
+ - spec/shared/liftable.rb
98
113
  - spec/spec_helper.rb
99
114
  - spec/symbol_spec.rb
100
115
  - spec/unbound_method_spec.rb