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/doc/HISTORY +2 -1
- data/doc/README +34 -8
- data/doc/rdoc/classes/Functor.html +207 -0
- data/doc/rdoc/classes/Functor.src/M000001.html +18 -0
- data/doc/rdoc/classes/Functor.src/M000002.html +19 -0
- data/doc/rdoc/classes/Functor.src/M000003.html +18 -0
- data/doc/rdoc/classes/Functor.src/M000004.html +19 -0
- data/doc/rdoc/classes/Functor.src/M000005.html +16 -0
- data/doc/rdoc/classes/Functor/Method.html +131 -0
- data/doc/rdoc/classes/Functor/Method.src/M000006.html +25 -0
- data/doc/rdoc/classes/Object.html +147 -0
- data/doc/rdoc/classes/Object.src/M000007.html +25 -0
- data/doc/rdoc/created.rid +1 -0
- data/doc/rdoc/files/doc/HISTORY.html +111 -0
- data/doc/rdoc/files/doc/README.html +210 -0
- data/doc/rdoc/files/lib/functor_rb.html +108 -0
- data/doc/rdoc/files/lib/object_rb.html +101 -0
- data/doc/rdoc/fr_class_index.html +29 -0
- data/doc/rdoc/fr_file_index.html +30 -0
- data/doc/rdoc/fr_method_index.html +33 -0
- data/doc/rdoc/index.html +24 -0
- data/doc/rdoc/rdoc-style.css +208 -0
- data/lib/functor.rb +16 -11
- data/test/guards.rb +18 -8
- metadata +31 -2
data/lib/functor.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
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(
|
40
|
+
object.instance_exec( *args, &match( args, &block ) )
|
41
41
|
end
|
42
42
|
|
43
43
|
def call( *args, &block )
|
44
|
-
|
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(
|
53
|
-
args
|
54
|
-
pattern, action = @rules.find { |
|
55
|
-
|
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
|
-
|
61
|
-
|
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
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
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
|
-
|
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 "
|
11
|
-
[*0..9].map(
|
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
|
-
|
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.
|
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-
|
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
|