functor 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,210 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
-
6
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
- <head>
8
- <title>File: README</title>
9
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
- <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12
- <script type="text/javascript">
13
- // <![CDATA[
14
-
15
- function popupCode( url ) {
16
- window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
- }
18
-
19
- function toggleCode( id ) {
20
- if ( document.getElementById )
21
- elem = document.getElementById( id );
22
- else if ( document.all )
23
- elem = eval( "document.all." + id );
24
- else
25
- return false;
26
-
27
- elemStyle = elem.style;
28
-
29
- if ( elemStyle.display != "block" ) {
30
- elemStyle.display = "block"
31
- } else {
32
- elemStyle.display = "none"
33
- }
34
-
35
- return true;
36
- }
37
-
38
- // Make codeblocks hidden by default
39
- document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
-
41
- // ]]>
42
- </script>
43
-
44
- </head>
45
- <body>
46
-
47
-
48
-
49
- <div id="fileHeader">
50
- <h1>README</h1>
51
- <table class="header-table">
52
- <tr class="top-aligned-row">
53
- <td><strong>Path:</strong></td>
54
- <td>doc/README
55
- </td>
56
- </tr>
57
- <tr class="top-aligned-row">
58
- <td><strong>Last Update:</strong></td>
59
- <td>Mon Jun 16 10:19:05 -0700 2008</td>
60
- </tr>
61
- </table>
62
- </div>
63
- <!-- banner header -->
64
-
65
- <div id="bodyContent">
66
-
67
-
68
-
69
- <div id="contextContent">
70
-
71
- <div id="description">
72
- <p>
73
- <a href="../../classes/Functor.html">Functor</a> provides pattern-based
74
- function and method dispatch for Ruby, originally inspired by Topher
75
- Cyll&#8216;s multi gem.
76
- </p>
77
- <h1>Method Functors</h1>
78
- <p>
79
- To use it in a class:
80
- </p>
81
- <pre>
82
- class Repeater
83
- attr_accessor :times
84
- include Functor::Method
85
- functor( :repeat, Integer ) { |x| x * @times }
86
- functor( :repeat, String ) { |s| [].fill( s, 0..@times ).join(' ') }
87
- end
88
-
89
- r = Repeater.new
90
- r.times = 5
91
- r.repeat( 5 ) # =&gt; 25
92
- r.repeat( &quot;-&quot; ) # =&gt; &quot;- - - - -&quot;
93
- r.repeat( 7.3 ) # =&gt; ArgumentError!
94
- </pre>
95
- <p>
96
- Warning: This defines a class instance variable <tt>@__functors</tt> behind
97
- the scenes as a side-effect. Also, although inheritance works within a
98
- functor method, super does not. To call the parent method, you need to call
99
- it explicitly using the <tt>functors</tt> class method, like this:
100
- </p>
101
- <pre>
102
- A.functors[ :foo ].apply( self, 'bar' )
103
- </pre>
104
- <h1>Stand-Alone Functors</h1>
105
- <p>
106
- You can also define <a href="../../classes/Functor.html">Functor</a>
107
- objects directly:
108
- </p>
109
- <pre>
110
- fib = Functor.new do
111
- given( 0 ) { 0 }
112
- given( 1 ) { 1 }
113
- given( Integer ) { |n| self.call( n - 1 ) + self.call( n - 2 ) }
114
- end
115
- </pre>
116
- <p>
117
- You can use functors directly with functions taking a block like this:
118
- </p>
119
- <pre>
120
- [ *0..10 ].map( &amp;fib ) # =&gt; [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
121
- </pre>
122
- <p>
123
- You can call a functor as a method using apply:
124
- </p>
125
- <pre>
126
- fun.apply( obj, 7 )
127
- </pre>
128
- <p>
129
- which is actually how the method functors are implemented.
130
- </p>
131
- <h1>Pattern Matching</h1>
132
- <p>
133
- Arguments are matched first using === and then ==, so anything that
134
- supports these methods can be matched against. In addition, you may pass
135
- &quot;guards,&quot; any object that responds to call and which take and
136
- object (the argument) and return true or false. This allows you to do
137
- things like this:
138
- </p>
139
- <pre>
140
- stripe ||= Functor.new do
141
- given( lambda { |x| x % 2 == 0 } ) { 'white' }
142
- given( lambda { |x| x % 2 == 1 } ) { 'silver' }
143
- end
144
- </pre>
145
- <p>
146
- which will return &quot;white&quot; and &quot;silver&quot; alternately for
147
- a sequence of numbers.
148
- </p>
149
- <h1>Precedence</h1>
150
- <p>
151
- Precedence is defined in order of declaration: first-come, first-serve, aka
152
- FIFO. Thus, you need to be careful in how you define your functor. The
153
- Fibonacci example above would not work properly if the Integer pattern was
154
- given first. That said, it is possible to redefine earlier cases, which, in
155
- effect, &quot;demotes&quot; it, as if it had not been declared before. So
156
- the following will work properly:
157
- </p>
158
- <pre>
159
- fib = Functor.new do
160
- given( Integer ) { |n| raise &quot;this would start an infinite loop ...&quot; }
161
- given( 0 ) { 0 }
162
- given( 1 ) { 1 }
163
- # but this will &quot;demote&quot; the Integer pattern and now it will work ...
164
- given( Integer ) { |n| self.call( n - 1 ) + self.call( n - 2 ) }
165
- end
166
- </pre>
167
- <p>
168
- This isn&#8216;t perfect, but it is very easy to predict, simple to
169
- implement, and reasonably fast, which other approaches (such as
170
- implementing a precedence scheme) are not.
171
- </p>
172
- <h1>Credits And Support</h1>
173
- <p>
174
- <a href="../../classes/Functor.html">Functor</a> was written by Dan Yoder,
175
- Matthew King, and Lawrence Pit. Send email to dan at zeraweb.com for
176
- support or questions.
177
- </p>
178
-
179
- </div>
180
-
181
-
182
- </div>
183
-
184
-
185
- </div>
186
-
187
-
188
- <!-- if includes -->
189
-
190
- <div id="section">
191
-
192
-
193
-
194
-
195
-
196
-
197
-
198
-
199
- <!-- if method_list -->
200
-
201
-
202
- </div>
203
-
204
-
205
- <div id="validator-badges">
206
- <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
207
- </div>
208
-
209
- </body>
210
- </html>
@@ -1,108 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
-
6
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
- <head>
8
- <title>File: functor.rb</title>
9
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
- <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12
- <script type="text/javascript">
13
- // <![CDATA[
14
-
15
- function popupCode( url ) {
16
- window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
- }
18
-
19
- function toggleCode( id ) {
20
- if ( document.getElementById )
21
- elem = document.getElementById( id );
22
- else if ( document.all )
23
- elem = eval( "document.all." + id );
24
- else
25
- return false;
26
-
27
- elemStyle = elem.style;
28
-
29
- if ( elemStyle.display != "block" ) {
30
- elemStyle.display = "block"
31
- } else {
32
- elemStyle.display = "none"
33
- }
34
-
35
- return true;
36
- }
37
-
38
- // Make codeblocks hidden by default
39
- document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
-
41
- // ]]>
42
- </script>
43
-
44
- </head>
45
- <body>
46
-
47
-
48
-
49
- <div id="fileHeader">
50
- <h1>functor.rb</h1>
51
- <table class="header-table">
52
- <tr class="top-aligned-row">
53
- <td><strong>Path:</strong></td>
54
- <td>lib/functor.rb
55
- </td>
56
- </tr>
57
- <tr class="top-aligned-row">
58
- <td><strong>Last Update:</strong></td>
59
- <td>Sun Jun 15 17:52:06 -0700 2008</td>
60
- </tr>
61
- </table>
62
- </div>
63
- <!-- banner header -->
64
-
65
- <div id="bodyContent">
66
-
67
-
68
-
69
- <div id="contextContent">
70
-
71
-
72
- <div id="requires-list">
73
- <h3 class="section-bar">Required files</h3>
74
-
75
- <div class="name-list">
76
- <a href="object_rb.html">lib/object</a>&nbsp;&nbsp;
77
- </div>
78
- </div>
79
-
80
- </div>
81
-
82
-
83
- </div>
84
-
85
-
86
- <!-- if includes -->
87
-
88
- <div id="section">
89
-
90
-
91
-
92
-
93
-
94
-
95
-
96
-
97
- <!-- if method_list -->
98
-
99
-
100
- </div>
101
-
102
-
103
- <div id="validator-badges">
104
- <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
105
- </div>
106
-
107
- </body>
108
- </html>
@@ -1,101 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
-
6
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
- <head>
8
- <title>File: object.rb</title>
9
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
- <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12
- <script type="text/javascript">
13
- // <![CDATA[
14
-
15
- function popupCode( url ) {
16
- window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
- }
18
-
19
- function toggleCode( id ) {
20
- if ( document.getElementById )
21
- elem = document.getElementById( id );
22
- else if ( document.all )
23
- elem = eval( "document.all." + id );
24
- else
25
- return false;
26
-
27
- elemStyle = elem.style;
28
-
29
- if ( elemStyle.display != "block" ) {
30
- elemStyle.display = "block"
31
- } else {
32
- elemStyle.display = "none"
33
- }
34
-
35
- return true;
36
- }
37
-
38
- // Make codeblocks hidden by default
39
- document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
-
41
- // ]]>
42
- </script>
43
-
44
- </head>
45
- <body>
46
-
47
-
48
-
49
- <div id="fileHeader">
50
- <h1>object.rb</h1>
51
- <table class="header-table">
52
- <tr class="top-aligned-row">
53
- <td><strong>Path:</strong></td>
54
- <td>lib/object.rb
55
- </td>
56
- </tr>
57
- <tr class="top-aligned-row">
58
- <td><strong>Last Update:</strong></td>
59
- <td>Sat Jun 14 13:44:12 -0700 2008</td>
60
- </tr>
61
- </table>
62
- </div>
63
- <!-- banner header -->
64
-
65
- <div id="bodyContent">
66
-
67
-
68
-
69
- <div id="contextContent">
70
-
71
-
72
-
73
- </div>
74
-
75
-
76
- </div>
77
-
78
-
79
- <!-- if includes -->
80
-
81
- <div id="section">
82
-
83
-
84
-
85
-
86
-
87
-
88
-
89
-
90
- <!-- if method_list -->
91
-
92
-
93
- </div>
94
-
95
-
96
- <div id="validator-badges">
97
- <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
98
- </div>
99
-
100
- </body>
101
- </html>
@@ -1,29 +0,0 @@
1
-
2
- <?xml version="1.0" encoding="iso-8859-1"?>
3
- <!DOCTYPE html
4
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
5
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6
-
7
- <!--
8
-
9
- Classes
10
-
11
- -->
12
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
13
- <head>
14
- <title>Classes</title>
15
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
16
- <link rel="stylesheet" href="rdoc-style.css" type="text/css" />
17
- <base target="docwin" />
18
- </head>
19
- <body>
20
- <div id="index">
21
- <h1 class="section-bar">Classes</h1>
22
- <div id="index-entries">
23
- <a href="classes/Functor.html">Functor</a><br />
24
- <a href="classes/Functor/Method.html">Functor::Method</a><br />
25
- <a href="classes/Object.html">Object</a><br />
26
- </div>
27
- </div>
28
- </body>
29
- </html>