dyoder-functor 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/functor.rb +11 -14
- metadata +1 -1
data/lib/functor.rb
CHANGED
@@ -11,7 +11,7 @@ class Functor
|
|
11
11
|
klass = self.name ; module_eval <<-CODE
|
12
12
|
def #{name}( *args, &block )
|
13
13
|
begin
|
14
|
-
|
14
|
+
#{klass}.functors[ :#{name} ].apply( self, *args, &block )
|
15
15
|
rescue ArgumentError => e
|
16
16
|
begin
|
17
17
|
super
|
@@ -19,11 +19,6 @@ class Functor
|
|
19
19
|
raise e
|
20
20
|
end
|
21
21
|
end
|
22
|
-
if rval.is_a? Continuation
|
23
|
-
super ; rval.call
|
24
|
-
else
|
25
|
-
rval
|
26
|
-
end
|
27
22
|
end
|
28
23
|
CODE
|
29
24
|
end
|
@@ -42,23 +37,21 @@ class Functor
|
|
42
37
|
end
|
43
38
|
|
44
39
|
def apply( object, *args, &block )
|
45
|
-
object.instance_exec( *args, &match(
|
40
|
+
object.instance_exec( *args, &match( args, &block ) )
|
46
41
|
end
|
47
42
|
|
48
43
|
def call( *args, &block )
|
49
|
-
|
50
|
-
match( *args, &block ).call( *args )
|
44
|
+
match( args, &block ).call( *args )
|
51
45
|
end
|
52
46
|
|
53
47
|
def to_proc ; lambda { |*args| self.call( *args ) } ; end
|
54
48
|
|
55
49
|
private
|
56
50
|
|
57
|
-
def match(
|
58
|
-
args
|
59
|
-
pattern, action = @rules.find { |
|
60
|
-
|
61
|
-
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 )
|
62
55
|
end
|
63
56
|
|
64
57
|
def match?( args, pattern )
|
@@ -69,4 +62,8 @@ class Functor
|
|
69
62
|
( rule.is_a?( Proc ) and rule.call( arg ) ) or rule === arg or rule == arg
|
70
63
|
end
|
71
64
|
|
65
|
+
def argument_error( args )
|
66
|
+
ArgumentError.new( "argument mismatch for argument(s): #{ args.map{ |arg| arg.inspect }.join(', ') }." )
|
67
|
+
end
|
68
|
+
|
72
69
|
end
|