lambda_driver 1.2.0 → 1.2.1

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/lib/lambda_driver.rb CHANGED
@@ -1,5 +1,5 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require "lambda_driver/version"
2
-
3
3
  Dir["#{File.dirname(__FILE__)}/lambda_driver/*.rb"].sort.each do |path|
4
4
  next if File.basename(path, '.rb') == 'core_ext'
5
5
  require "lambda_driver/#{File.basename(path, '.rb')}"
@@ -1,94 +1,11 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  module LambdaDriver::Callable
2
3
 
3
- def call(*args, &block)
4
+ def <(*args, &block)
4
5
  if block_given?
5
6
  self.to_proc.call(*args, &block)
6
7
  else
7
8
  self.to_proc.call(*args)
8
9
  end
9
10
  end
10
-
11
- # Returns new lambda which composed self and given function.
12
- # A composed proc called with args, executes `self.(g(*args)).
13
- #
14
- # f = lamdba{|x| x.to_s }
15
- # g = lambda{|y| y.length }
16
- # h = f compose g
17
- # h.(:hoge) # => 4
18
- #
19
- # This method is aliased as `<<`.
20
- #
21
- # f << g # => f.compose(g)
22
- #
23
- def compose(g)
24
- lambda{|*args| self.to_proc.call(g.to_proc.call(*args)) }
25
- end
26
-
27
- # g compose self
28
- def >>(g)
29
- g.to_proc << self
30
- end
31
-
32
- # Returns partially applied function that has 2nd and more parameters
33
- # fixed by given *args.
34
- #
35
- # f = lamdba{|x, y, z| [x, y, z]}
36
- # h = f.with_args(:a, :b)
37
- # h.(:c) # => [:c, :a, :b]
38
- #
39
- # This method is aliased as `*`.
40
- #
41
- # f * :foo # => f.with_args(:foo)
42
- #
43
- def with_args(*args)
44
- lambda{|v|
45
- self.to_proc.call(*([v] + args))
46
- }
47
- end
48
-
49
- # Returns function whose parameter order spawed 1st for 2nd.
50
- # A result of filped fuction is curried by Proc#curry.
51
- #
52
- # f = lamdba{|x, y, z| [x, y, z]}
53
- # h = f.flip
54
- # h.(:a).(:b).(:c) # => [:b, :a, :c]
55
- #
56
- # If arguments is var-args, pass explicitly arity to curring.
57
- #
58
- # p = Proc.new{|*args| args.inspect }
59
- # p.flip(3).call(:a).(:b).(:c) # => "[:b, :a, :c]"
60
- # p.flip(4).call(:a).(:b).(:c).(:d) # => "[:b, :a, :c, :d]"
61
- #
62
- # If arity is 0 or 1, flip returns itself.
63
- #
64
- # This method is aliased as `~@`.
65
- #
66
- # ~f # => f.filp
67
- #
68
- def flip(arity = nil)
69
- f = self.to_proc
70
- return self if (0..1).include?(f.arity)
71
- return self if f.arity == -1 && arity.nil?
72
-
73
- curried = f.curry(arity)
74
- lambda{|x|
75
- lambda{|y|
76
- g = curried[y]
77
- (g.respond_to? :call) ? g[x] : g
78
- }
79
- }
80
- end
81
-
82
- def curry(arity = nil)
83
- self.to_proc.curry(arity)
84
- end
85
-
86
- def self.included(klass)
87
- klass.send(:alias_method, :+@, :to_proc)
88
- klass.send(:alias_method, :<, :call)
89
- klass.send(:alias_method, :<<, :compose)
90
- klass.send(:alias_method, :*, :with_args)
91
- klass.send(:alias_method, :~@, :flip)
92
- klass.send(:alias_method, :%, :curry)
93
- end
94
11
  end
@@ -0,0 +1,27 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module LambdaDriver::Composable
3
+ # Returns new lambda which composed self and given function.
4
+ # A composed proc called with args, executes `self.(g(*args)).
5
+ #
6
+ # f = lamdba{|x| x.to_s }
7
+ # g = lambda{|y| y.length }
8
+ # h = f compose g
9
+ # h.(:hoge) # => 4
10
+ #
11
+ # This method is aliased as `<<`.
12
+ #
13
+ # f << g # => f.compose(g)
14
+ #
15
+ def compose(g)
16
+ lambda{|*args| self.to_proc.call(g.to_proc.call(*args)) }
17
+ end
18
+
19
+ # g compose self
20
+ def >>(g)
21
+ g.to_proc << self
22
+ end
23
+
24
+ def self.included(klass)
25
+ klass.send(:alias_method, :<<, :compose)
26
+ end
27
+ end
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  Dir["#{File.dirname(__FILE__)}/core_ext/*.rb"].sort.each do |path|
2
3
  require "lambda_driver/core_ext/#{File.basename(path, '.rb')}"
3
4
  end
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  class Class
2
3
  alias_method :/, :instance_method
3
4
  end
@@ -1,5 +1,10 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  class Method
2
3
  include LambdaDriver::Callable
3
- include LambdaDriver::Currying if RUBY_VERSION < '1.9.0'
4
+ include LambdaDriver::Composable
5
+ include LambdaDriver::WithArgs
6
+ include LambdaDriver::Flipable
7
+ include LambdaDriver::ProcConvertable
8
+ include LambdaDriver::Currying
4
9
  include LambdaDriver::Liftable
5
10
  end
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  class Object
2
3
  include LambdaDriver::Op::Proxy
3
4
  include LambdaDriver::Revapply
@@ -1,5 +1,10 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  class Proc
2
3
  include LambdaDriver::Callable
3
- include LambdaDriver::Currying if RUBY_VERSION < '1.9.0'
4
+ include LambdaDriver::Composable
5
+ include LambdaDriver::WithArgs
6
+ include LambdaDriver::Flipable
7
+ include LambdaDriver::ProcConvertable
8
+ include LambdaDriver::Currying
4
9
  include LambdaDriver::Liftable
5
10
  end
@@ -1,6 +1,12 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  class Symbol
2
3
  include LambdaDriver::Callable
3
- include LambdaDriver::Currying if RUBY_VERSION < '1.9.0'
4
+ include LambdaDriver::Composable
5
+ include LambdaDriver::WithArgs
6
+ include LambdaDriver::Flipable
7
+ include LambdaDriver::ProcConvertable
8
+ include LambdaDriver::Currying
9
+ include LambdaDriver::Liftable
4
10
 
5
11
  def to_method
6
12
  lambda{|obj| obj._(self) }
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  class UnboundMethod
2
3
  alias_method :<, :bind
3
4
  end
@@ -0,0 +1,10 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module LambdaDriver::Curring
3
+ def curry(arity = nil)
4
+ self.to_proc.curry(arity)
5
+ end
6
+
7
+ def self.included(klass)
8
+ klass.send(:alias_method, :%, :curry)
9
+ end
10
+ end
@@ -1,10 +1,18 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  module LambdaDriver::Currying
2
- def curry(arity = nil)
3
- f = self.to_proc
4
- arity ||= __arity(f)
5
- return f if arity == 0
6
3
 
7
- lambda{|arg| __curry(f, arity, arg, []) }
4
+ if RUBY_VERSION < '1.9.0'
5
+ def curry(arity = nil)
6
+ f = self.to_proc
7
+ arity ||= __arity(f)
8
+ return f if arity == 0
9
+
10
+ lambda{|arg| __curry(f, arity, arg, []) }
11
+ end
12
+ else
13
+ def curry(arity = nil)
14
+ self.to_proc.curry(arity)
15
+ end
8
16
  end
9
17
 
10
18
  private
@@ -17,4 +25,9 @@ module LambdaDriver::Currying
17
25
  return f.call(*args) if arity == 1
18
26
  lambda{|arg| __curry(f, arity - 1, arg, args) }
19
27
  end
28
+
29
+
30
+ def self.included(klass)
31
+ klass.send(:alias_method, :%, :curry)
32
+ end
20
33
  end
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  module LambdaDriver::Disjunction
2
3
  def disjunction(f = nil, &block)
3
4
  if f.nil? && (not block_given?)
@@ -0,0 +1,39 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module LambdaDriver::Flipable
3
+ # Returns function whose parameter order spawed 1st for 2nd.
4
+ # A result of filped fuction is curried by Proc#curry.
5
+ #
6
+ # f = lamdba{|x, y, z| [x, y, z]}
7
+ # h = f.flip
8
+ # h.(:a).(:b).(:c) # => [:b, :a, :c]
9
+ #
10
+ # If arguments is var-args, pass explicitly arity to curring.
11
+ #
12
+ # p = Proc.new{|*args| args.inspect }
13
+ # p.flip(3).call(:a).(:b).(:c) # => "[:b, :a, :c]"
14
+ # p.flip(4).call(:a).(:b).(:c).(:d) # => "[:b, :a, :c, :d]"
15
+ #
16
+ # If arity is 0 or 1, flip returns itself.
17
+ #
18
+ # This method is aliased as `~@`.
19
+ #
20
+ # ~f # => f.filp
21
+ #
22
+ def flip(arity = nil)
23
+ f = self.to_proc
24
+ return self if (0..1).include?(f.arity)
25
+ return self if f.arity == -1 && arity.nil?
26
+
27
+ curried = f.curry(arity)
28
+ lambda{|x|
29
+ lambda{|y|
30
+ g = curried[y]
31
+ (g.respond_to? :call) ? g[x] : g
32
+ }
33
+ }
34
+ end
35
+
36
+ def self.included(klass)
37
+ klass.send(:alias_method, :~@, :flip)
38
+ end
39
+ end
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  module LambdaDriver::Liftable
2
3
 
3
4
  # compose self and give fuction with checking g(x) is mzero.
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  module LambdaDriver::Mzero
2
3
  def mzero?
3
4
  mzero_method = self.respond_to?(:empty?) ? :empty? : :nil?
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  module LambdaDriver::Op
2
3
  module Proxy
3
4
  def _(method = nil)
@@ -0,0 +1,6 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module LambdaDriver::ProcConvertable
3
+ def self.included(klass)
4
+ klass.send(:alias_method, :+@, :to_proc)
5
+ end
6
+ end
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  module LambdaDriver::Revapply
2
3
  def revapply(f = nil, &block)
3
4
  if f.nil? && (not block_given?)
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  module LambdaDriver
2
- VERSION = "1.2.0"
3
+ VERSION = "1.2.1"
3
4
  end
@@ -0,0 +1,24 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module LambdaDriver::WithArgs
3
+
4
+ # Returns partially applied function that has 2nd and more parameters
5
+ # fixed by given *args.
6
+ #
7
+ # f = lamdba{|x, y, z| [x, y, z]}
8
+ # h = f.with_args(:a, :b)
9
+ # h.(:c) # => [:c, :a, :b]
10
+ #
11
+ # This method is aliased as `*`.
12
+ #
13
+ # f * :foo # => f.with_args(:foo)
14
+ #
15
+ def with_args(*args)
16
+ lambda{|v|
17
+ self.to_proc.call(*([v] + args))
18
+ }
19
+ end
20
+
21
+ def self.included(klass)
22
+ klass.send(:alias_method, :*, :with_args)
23
+ end
24
+ end
data/spec/class_spec.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require 'spec_helper'
2
3
 
3
4
  describe 'class' do
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require 'spec_helper'
2
3
 
3
4
  describe LambdaDriver::Disjunction do
data/spec/lambda_spec.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require 'spec_helper'
2
3
 
3
4
  describe 'lambda' do
@@ -54,6 +55,7 @@ describe 'lambda' do
54
55
  subject { lambda{|x| x.to_s + "_f"} }
55
56
 
56
57
  it_should_behave_like 'call'
58
+ it_should_behave_like 'call(<)'
57
59
  end
58
60
 
59
61
  describe 'ailases' do
data/spec/method_spec.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require 'spec_helper'
2
3
 
3
4
  describe Method do
@@ -74,6 +75,9 @@ describe Method do
74
75
  it_should_behave_like 'call' do
75
76
  let(:x) { "foo" }
76
77
  end
78
+ it_should_behave_like 'call(<)' do
79
+ let(:x) { "foo" }
80
+ end
77
81
  end
78
82
 
79
83
  describe 'ailases' do
data/spec/op_spec.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require 'spec_helper'
2
3
 
3
4
  shared_examples_for 'method_or_lambda' do |label|
data/spec/proc_spec.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require 'spec_helper'
2
3
 
3
4
  describe Proc do
@@ -54,6 +55,7 @@ describe Proc do
54
55
  subject { Proc.new{|x| x.to_s + "_f"} }
55
56
 
56
57
  it_should_behave_like 'call'
58
+ it_should_behave_like 'call(<)'
57
59
  end
58
60
 
59
61
  describe 'ailases' do
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require 'spec_helper'
2
3
 
3
4
  describe LambdaDriver::Revapply do
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require 'spec_helper'
2
3
 
3
4
  shared_examples_for 'composable' do
@@ -93,7 +94,7 @@ shared_examples_for 'flip(arity=1)' do
93
94
  }
94
95
 
95
96
  it(' f.flip.call(x) returns proc ') {
96
- subject.flip.call(y) == subject.call(y)
97
+ subject.flip.to_proc.call(y) == subject.to_proc.call(y)
97
98
  }
98
99
  end
99
100
 
@@ -106,7 +107,7 @@ shared_examples_for 'flip(varargs)' do
106
107
  }
107
108
 
108
109
  it('f.flip(2).call(x) returns proc ') {
109
- subject.flip(2).call(y) == subject.call(y)
110
+ subject.flip(2).call(y) == subject.to_proc.call(y)
110
111
  }
111
112
 
112
113
  it('~f.flip(2).call(x).call(y) should be f.call(y,x)'){
@@ -151,16 +152,21 @@ end
151
152
 
152
153
  shared_examples_for 'call' do
153
154
  it { should respond_to :call}
154
- it { should respond_to :<}
155
155
 
156
156
  let(:x) { :foo }
157
157
 
158
158
  it('f.call(x) == f.call(x)'){
159
159
  subject.call(x).should == subject.call(x)
160
160
  }
161
+ end
162
+
163
+ shared_examples_for 'call(<)' do
164
+ it { should respond_to :<}
165
+
166
+ let(:x) { :foo }
161
167
 
162
168
  it('(f < x) == f.call(x)'){
163
- (subject < x).should == subject.call(x)
169
+ (subject < x).should == subject.to_proc.call(x)
164
170
  }
165
171
  end
166
172
 
@@ -170,7 +176,7 @@ shared_examples_for 'aliases' do
170
176
  let(:g) { lambda{|x| (x.to_s * 2).to_s + "_g" } }
171
177
 
172
178
  it('(~f < x) should be f.flip.call(x)'){
173
- (~subject < x).should == subject.flip.call(x)
179
+ (~subject < x).should == subject.flip.to_proc.call(x)
174
180
  }
175
181
 
176
182
  it('(f << g < x) should f.compose(g).call(x)'){
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require 'spec_helper'
2
3
 
3
4
  shared_examples_for 'liftable' do
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  # This file was generated by the `rspec --init` command. Conventionally, all
2
3
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
4
  # Require this file using `require "spec_helper.rb"` to ensure that it is only
data/spec/symbol_spec.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require 'spec_helper'
2
3
 
3
4
  describe Symbol do
@@ -46,7 +47,7 @@ describe Symbol do
46
47
  describe '#call' do
47
48
  subject { :to_s }
48
49
 
49
- it_should_behave_like 'call'
50
+ it_should_behave_like 'call(<)'
50
51
  end
51
52
 
52
53
  describe 'ailases' do
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require 'spec_helper'
2
3
 
3
4
  describe UnboundMethod do
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.2.0
4
+ version: 1.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-01-28 00:00:00.000000000 Z
12
+ date: 2014-01-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -44,6 +44,7 @@ files:
44
44
  - lambda_driver.gemspec
45
45
  - lib/lambda_driver.rb
46
46
  - lib/lambda_driver/callable.rb
47
+ - lib/lambda_driver/composable.rb
47
48
  - lib/lambda_driver/core_ext.rb
48
49
  - lib/lambda_driver/core_ext/class.rb
49
50
  - lib/lambda_driver/core_ext/method.rb
@@ -51,13 +52,17 @@ files:
51
52
  - lib/lambda_driver/core_ext/proc.rb
52
53
  - lib/lambda_driver/core_ext/symbol.rb
53
54
  - lib/lambda_driver/core_ext/unbound_method.rb
55
+ - lib/lambda_driver/currring.rb
54
56
  - lib/lambda_driver/currying.rb
55
57
  - lib/lambda_driver/disjunction.rb
58
+ - lib/lambda_driver/flipable.rb
56
59
  - lib/lambda_driver/liftable.rb
57
60
  - lib/lambda_driver/mzero.rb
58
61
  - lib/lambda_driver/op.rb
62
+ - lib/lambda_driver/proc_convertable.rb
59
63
  - lib/lambda_driver/revapply.rb
60
64
  - lib/lambda_driver/version.rb
65
+ - lib/lambda_driver/with_args.rb
61
66
  - spec/class_spec.rb
62
67
  - spec/disjunction_spec.rb
63
68
  - spec/lambda_spec.rb
@@ -82,18 +87,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
82
87
  - - ! '>='
83
88
  - !ruby/object:Gem::Version
84
89
  version: '0'
85
- segments:
86
- - 0
87
- hash: -920517596245893888
88
90
  required_rubygems_version: !ruby/object:Gem::Requirement
89
91
  none: false
90
92
  requirements:
91
93
  - - ! '>='
92
94
  - !ruby/object:Gem::Version
93
95
  version: '0'
94
- segments:
95
- - 0
96
- hash: -920517596245893888
97
96
  requirements: []
98
97
  rubyforge_project:
99
98
  rubygems_version: 1.8.23