functor 0.3.1 → 0.4.2

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/functor.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'lib/object'
1
+ require "#{File.dirname(__FILE__)}/object"
2
2
 
3
3
  class Functor
4
4
 
@@ -37,28 +37,33 @@ class Functor
37
37
  end
38
38
 
39
39
  def apply( object, *args, &block )
40
- object.instance_exec( *args, &match( *args, &block ) )
40
+ object.instance_exec( *args, &match( args, &block ) )
41
41
  end
42
42
 
43
43
  def call( *args, &block )
44
- args.push( block ) if block_given?
45
- match( *args, &block ).call( *args )
44
+ match( args, &block ).call( *args )
46
45
  end
47
46
 
48
47
  def to_proc ; lambda { |*args| self.call( *args ) } ; end
49
48
 
50
49
  private
51
50
 
52
- def match( *args, &block )
53
- args.push( block ) if block_given?
54
- pattern, action = @rules.find { | pattern, action | match?( args, pattern ) }
55
- raise ArgumentError.new( "argument mismatch for argument(s): #{args.inspect}." ) unless action
56
- return action
51
+ def match( args, &block )
52
+ args << block if block_given?
53
+ pattern, action = @rules.find { | p, a | match?( args, p ) }
54
+ action or raise argument_error( args )
57
55
  end
58
56
 
59
57
  def match?( args, pattern )
60
- pattern.zip(args).all? { |x,y| x === y or x == y or
61
- ( x.respond_to?(:call) && x.call( y ) ) } if pattern.length == args.length
58
+ args.zip( pattern ).all? { | arg, rule | pair?( arg, rule ) } if args.length == pattern.length
59
+ end
60
+
61
+ def pair?( arg, rule )
62
+ ( rule.is_a?( Proc ) and rule.call( arg ) ) or rule === arg or rule == arg
63
+ end
64
+
65
+ def argument_error( args )
66
+ ArgumentError.new( "argument mismatch for argument(s): #{ args.map{ |arg| arg.inspect }.join(', ') }." )
62
67
  end
63
68
 
64
69
  end
data/test/guards.rb CHANGED
@@ -1,15 +1,25 @@
1
1
  require 'test/helpers'
2
2
 
3
- stripe ||= Functor.new do
4
- given( lambda { |x| x % 2 == 0 } ) { 'white' }
5
- given( lambda { |x| x % 2 == 1 } ) { 'silver' }
6
- end
3
+ describe "Dispatch should support guards" do
4
+
5
+ before do
6
+ @stripe = Functor.new do
7
+ given( lambda { |x| x % 2 == 0 } ) { 'white' }
8
+ given( lambda { |x| x % 2 == 1 } ) { 'silver' }
9
+ end
7
10
 
8
- describe "Dipatch should support guards" do
11
+ @safe_divide = Functor.new do
12
+ given( lambda { |x| x == 0 }, Integer ) { |x,y| false }
13
+ given( Integer, Integer ) { |x,y| ( y / ( x * 1.0 )) }
14
+ end
15
+ end
9
16
 
10
- specify "allowing you to use odd or even numbers as a dispatcher" do
11
- [*0..9].map( &stripe ).should == %w( white silver ) * 5
17
+ specify "such as odd or even numbers" do
18
+ [*0..9].map( &@stripe ).should == %w( white silver ) * 5
12
19
  end
13
20
 
14
- end
21
+ specify "even with multiple arguments" do
22
+ @safe_divide.call( 0,7 ).should == false
23
+ end
15
24
 
25
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: functor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Yoder
@@ -11,7 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2008-06-15 00:00:00 -07:00
14
+ date: 2008-07-11 00:00:00 -07:00
15
15
  default_executable:
16
16
  dependencies: []
17
17
 
@@ -25,6 +25,35 @@ extra_rdoc_files: []
25
25
 
26
26
  files:
27
27
  - doc/HISTORY
28
+ - doc/rdoc
29
+ - doc/rdoc/classes
30
+ - doc/rdoc/classes/Functor
31
+ - doc/rdoc/classes/Functor/Method.html
32
+ - doc/rdoc/classes/Functor/Method.src
33
+ - doc/rdoc/classes/Functor/Method.src/M000006.html
34
+ - doc/rdoc/classes/Functor.html
35
+ - doc/rdoc/classes/Functor.src
36
+ - doc/rdoc/classes/Functor.src/M000001.html
37
+ - doc/rdoc/classes/Functor.src/M000002.html
38
+ - doc/rdoc/classes/Functor.src/M000003.html
39
+ - doc/rdoc/classes/Functor.src/M000004.html
40
+ - doc/rdoc/classes/Functor.src/M000005.html
41
+ - doc/rdoc/classes/Object.html
42
+ - doc/rdoc/classes/Object.src
43
+ - doc/rdoc/classes/Object.src/M000007.html
44
+ - doc/rdoc/created.rid
45
+ - doc/rdoc/files
46
+ - doc/rdoc/files/doc
47
+ - doc/rdoc/files/doc/HISTORY.html
48
+ - doc/rdoc/files/doc/README.html
49
+ - doc/rdoc/files/lib
50
+ - doc/rdoc/files/lib/functor_rb.html
51
+ - doc/rdoc/files/lib/object_rb.html
52
+ - doc/rdoc/fr_class_index.html
53
+ - doc/rdoc/fr_file_index.html
54
+ - doc/rdoc/fr_method_index.html
55
+ - doc/rdoc/index.html
56
+ - doc/rdoc/rdoc-style.css
28
57
  - doc/README
29
58
  - lib/functor.rb
30
59
  - lib/object.rb