cartesian 0.5.0 → 0.5.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.
Files changed (49) hide show
  1. data/History.txt +8 -1
  2. data/Manifest.txt +42 -0
  3. data/README.rdoc +3 -6
  4. data/lib/cartesian.rb +11 -9
  5. data/lib/cartesian/version.rb +7 -1
  6. data/lib/recursive.rb +2 -0
  7. data/script/txt2html +82 -0
  8. data/website/doc/classes/Array.html +128 -0
  9. data/website/doc/classes/Cartesian.html +398 -0
  10. data/website/doc/classes/Cartesian.src/M000020.html +18 -0
  11. data/website/doc/classes/Cartesian.src/M000021.html +18 -0
  12. data/website/doc/classes/Cartesian.src/M000022.html +18 -0
  13. data/website/doc/classes/Cartesian.src/M000023.html +23 -0
  14. data/website/doc/classes/Cartesian.src/M000026.html +23 -0
  15. data/website/doc/classes/Cartesian.src/M000027.html +30 -0
  16. data/website/doc/classes/CartesianIterator.html +326 -0
  17. data/website/doc/classes/CartesianIterator.src/M000001.html +21 -0
  18. data/website/doc/classes/CartesianIterator.src/M000002.html +18 -0
  19. data/website/doc/classes/CartesianIterator.src/M000003.html +21 -0
  20. data/website/doc/classes/CartesianIterator.src/M000005.html +20 -0
  21. data/website/doc/classes/CartesianIterator.src/M000008.html +20 -0
  22. data/website/doc/classes/CartesianIterator.src/M000009.html +19 -0
  23. data/website/doc/classes/CartesianIterator.src/M000012.html +19 -0
  24. data/website/doc/classes/CartesianIterator.src/M000013.html +39 -0
  25. data/website/doc/classes/Enumerable.html +112 -0
  26. data/website/doc/classes/GridSearch.html +160 -0
  27. data/website/doc/classes/GridSearch.src/M000014.html +18 -0
  28. data/website/doc/classes/GridSearch.src/M000015.html +18 -0
  29. data/website/doc/classes/Iterable.html +176 -0
  30. data/website/doc/classes/Iterable.src/M000016.html +19 -0
  31. data/website/doc/classes/Iterable.src/M000017.html +19 -0
  32. data/website/doc/classes/Iterable.src/M000018.html +18 -0
  33. data/website/doc/classes/Iterable.src/M000019.html +18 -0
  34. data/website/doc/classes/Range.html +118 -0
  35. data/website/doc/created.rid +1 -0
  36. data/website/doc/files/cartesian_iterator_rb.html +101 -0
  37. data/website/doc/files/cartesian_rb.html +108 -0
  38. data/website/doc/files/grid_search_rb.html +101 -0
  39. data/website/doc/fr_class_index.html +33 -0
  40. data/website/doc/fr_file_index.html +29 -0
  41. data/website/doc/fr_method_index.html +54 -0
  42. data/website/doc/index.html +24 -0
  43. data/website/doc/rdoc-style.css +208 -0
  44. data/website/index.html +110 -0
  45. data/website/index.txt +96 -0
  46. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  47. data/website/stylesheets/screen.css +138 -0
  48. data/website/template.html.erb +48 -0
  49. metadata +48 -5
data/History.txt CHANGED
@@ -1,3 +1,10 @@
1
+ === 0.5.1 2011-01-04
2
+
3
+ * 1 minor enhancements:
4
+ * code comment/documentation update
5
+ * README update
6
+ * website created (textile index)
7
+
1
8
  === 0.5.0 2011-01-03
2
9
 
3
10
  * 1 major enhancements:
@@ -28,7 +35,7 @@
28
35
  === 0.2.3 13-01-2007 20:50
29
36
 
30
37
  * 1 minor enhancement:
31
- * power! (aliased as "**") method added
38
+ * power! (aliased as '**') method added
32
39
 
33
40
  === 0.2.1 13-01-2007 01:44
34
41
 
data/Manifest.txt CHANGED
@@ -15,6 +15,7 @@ lib/recursive.rb
15
15
  script/console
16
16
  script/destroy
17
17
  script/generate
18
+ script/txt2html
18
19
  test/benchmark.rb
19
20
  test/extensions.rb
20
21
  test/test_cartesian.rb
@@ -23,3 +24,44 @@ test/test_extensions.rb
23
24
  test/test_grid_search.rb
24
25
  test/test_helper.rb
25
26
  test/test_suite.rb
27
+ website/doc/classes/Array.html
28
+ website/doc/classes/Cartesian.html
29
+ website/doc/classes/Cartesian.src/M000020.html
30
+ website/doc/classes/Cartesian.src/M000021.html
31
+ website/doc/classes/Cartesian.src/M000022.html
32
+ website/doc/classes/Cartesian.src/M000023.html
33
+ website/doc/classes/Cartesian.src/M000026.html
34
+ website/doc/classes/Cartesian.src/M000027.html
35
+ website/doc/classes/CartesianIterator.html
36
+ website/doc/classes/CartesianIterator.src/M000001.html
37
+ website/doc/classes/CartesianIterator.src/M000002.html
38
+ website/doc/classes/CartesianIterator.src/M000003.html
39
+ website/doc/classes/CartesianIterator.src/M000005.html
40
+ website/doc/classes/CartesianIterator.src/M000008.html
41
+ website/doc/classes/CartesianIterator.src/M000009.html
42
+ website/doc/classes/CartesianIterator.src/M000012.html
43
+ website/doc/classes/CartesianIterator.src/M000013.html
44
+ website/doc/classes/Enumerable.html
45
+ website/doc/classes/GridSearch.html
46
+ website/doc/classes/GridSearch.src/M000014.html
47
+ website/doc/classes/GridSearch.src/M000015.html
48
+ website/doc/classes/Iterable.html
49
+ website/doc/classes/Iterable.src/M000016.html
50
+ website/doc/classes/Iterable.src/M000017.html
51
+ website/doc/classes/Iterable.src/M000018.html
52
+ website/doc/classes/Iterable.src/M000019.html
53
+ website/doc/classes/Range.html
54
+ website/doc/created.rid
55
+ website/doc/files/cartesian_iterator_rb.html
56
+ website/doc/files/cartesian_rb.html
57
+ website/doc/files/grid_search_rb.html
58
+ website/doc/fr_class_index.html
59
+ website/doc/fr_file_index.html
60
+ website/doc/fr_method_index.html
61
+ website/doc/index.html
62
+ website/doc/rdoc-style.css
63
+ website/index.html
64
+ website/index.txt
65
+ website/javascripts/rounded_corners_lite.inc.js
66
+ website/stylesheets/screen.css
67
+ website/template.html.erb
data/README.rdoc CHANGED
@@ -1,6 +1,6 @@
1
1
  = cartesian
2
2
 
3
- * http://github.com/adrianomitre/cartesian
3
+ * http://adrianomitre.github.com/cartesian/website/index.html
4
4
 
5
5
  == DESCRIPTION:
6
6
 
@@ -25,13 +25,10 @@ One can use the Cartesian module directly
25
25
  bar = ["a", "b"]
26
26
  Cartesian::product(foo, bar) #=> [[1, "a"], [1, "b"], [2, "a"], [2, "b"]]
27
27
 
28
- or use the methods provided by the mixin in the Array classees
29
- require 'cartesian'
30
- foo = [1, 2]
31
- bar = ["a", "b"]
28
+ or use the methods provided by the mixin in the Array class
32
29
  foo.cartesian(bar) #=> [[1, "a"], [1, "b"], [2, "a"], [2, "b"]]
33
30
 
34
- which include the short and sweet _x_ method
31
+ which include the short'n'sweet _x_ method
35
32
  v = [] #=> []
36
33
  for a,b in [1,2].x [3,4]
37
34
  v << [a,b]
data/lib/cartesian.rb CHANGED
@@ -1,5 +1,9 @@
1
- #
2
- # The CartesianProduct module provide methods for the calculation
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'cartesian_iterator'
5
+
6
+ # The Cartesian module provide methods for the calculation
3
7
  # of the cartesian producted between two enumerable objects.
4
8
  #
5
9
  # It can also be easily mixed in into any enumerable class,
@@ -30,15 +34,12 @@
30
34
  # bar = ["a", "b"]
31
35
  # foo.cartesian(bar) #=> [[1, "a"], [1, "b"], [2, "a"], [2, "b"]]
32
36
  #
33
-
34
- $:.unshift(File.dirname(__FILE__)) unless
35
- $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
36
-
37
- require 'cartesian_iterator'
38
-
39
37
  module Cartesian
40
38
 
41
- VERSION = '0.5.0'
39
+ # Unfortunately, as of now, the version data must be replicated in ../cartesian.rb,
40
+ # due to a mix of newgem versions, each requiring a different one. Not DRY :P
41
+ #
42
+ VERSION = "0.5.2"
42
43
 
43
44
  # Produces the cartesian product of self and other.
44
45
  # The result is an array of pairs (i.e. two-element arrays).
@@ -164,3 +165,4 @@ end
164
165
  class Range
165
166
  include Cartesian
166
167
  end
168
+
@@ -1,9 +1,15 @@
1
1
  module Cartesian #:nodoc:
2
+
3
+ # Unfortunately, as of now, the version data must be replicated in ../cartesian.rb,
4
+ # due to a mix of newgem versions, each requiring a different one. Not DRY :P
5
+ #
2
6
  module VERSION #:nodoc:
3
7
  MAJOR = 0
4
8
  MINOR = 5
5
- TINY = 0
9
+ TINY = 2
6
10
 
7
11
  STRING = [MAJOR, MINOR, TINY].join('.')
8
12
  end
13
+
9
14
  end
15
+
data/lib/recursive.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # encoding: UTF-8
2
+
1
3
  # Code by Brian Schröäer
2
4
  # source: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/151857
3
5
  #
data/script/txt2html ADDED
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ GEM_NAME = 'cartesian' # what ppl will type to install your gem
4
+ RUBYFORGE_PROJECT = 'cartesian'
5
+
6
+ require 'rubygems'
7
+ begin
8
+ require 'newgem'
9
+ require 'rubyforge'
10
+ rescue LoadError
11
+ puts "\n\nGenerating the website requires the newgem RubyGem"
12
+ puts "Install: gem install newgem\n\n"
13
+ exit(1)
14
+ end
15
+ require 'redcloth'
16
+ require 'syntax/convertors/html'
17
+ require 'erb'
18
+ require File.dirname(__FILE__) + "/../lib/#{GEM_NAME}/version.rb"
19
+
20
+ version = Cartesian::VERSION::STRING
21
+ download = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
22
+
23
+ def rubyforge_project_id
24
+ RubyForge.new.autoconfig["group_ids"][RUBYFORGE_PROJECT]
25
+ end
26
+
27
+ class Fixnum
28
+ def ordinal
29
+ # teens
30
+ return 'th' if (10..19).include?(self % 100)
31
+ # others
32
+ case self % 10
33
+ when 1: return 'st'
34
+ when 2: return 'nd'
35
+ when 3: return 'rd'
36
+ else return 'th'
37
+ end
38
+ end
39
+ end
40
+
41
+ class Time
42
+ def pretty
43
+ return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
44
+ end
45
+ end
46
+
47
+ def convert_syntax(syntax, source)
48
+ return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
49
+ end
50
+
51
+ if ARGV.length >= 1
52
+ src, template = ARGV
53
+ template ||= File.join(File.dirname(__FILE__), '/../website/template.html.erb')
54
+ else
55
+ puts("Usage: #{File.split($0).last} source.txt [template.html.erb] > output.html")
56
+ exit!
57
+ end
58
+
59
+ template = ERB.new(File.open(template).read)
60
+
61
+ title = nil
62
+ body = nil
63
+ File.open(src) do |fsrc|
64
+ title_text = fsrc.readline
65
+ body_text_template = fsrc.read
66
+ body_text = ERB.new(body_text_template).result(binding)
67
+ syntax_items = []
68
+ body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
69
+ ident = syntax_items.length
70
+ element, syntax, source = $1, $2, $3
71
+ syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
72
+ "syntax-temp-#{ident}"
73
+ }
74
+ title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
75
+ body = RedCloth.new(body_text).to_html
76
+ body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
77
+ end
78
+ stat = File.stat(src)
79
+ created = stat.ctime
80
+ modified = stat.mtime
81
+
82
+ $stdout << template.result(binding)
@@ -0,0 +1,128 @@
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>Class: Array</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="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">Array</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../files/cartesian_rb.html">
59
+ cartesian.rb
60
+ </a>
61
+ <br />
62
+ <a href="../files/cartesian_iterator_rb.html">
63
+ cartesian_iterator.rb
64
+ </a>
65
+ <br />
66
+ <a href="../files/grid_search_rb.html">
67
+ grid_search.rb
68
+ </a>
69
+ <br />
70
+ </td>
71
+ </tr>
72
+
73
+ <tr class="top-aligned-row">
74
+ <td><strong>Parent:</strong></td>
75
+ <td>
76
+ Object
77
+ </td>
78
+ </tr>
79
+ </table>
80
+ </div>
81
+ <!-- banner header -->
82
+
83
+ <div id="bodyContent">
84
+
85
+
86
+
87
+ <div id="contextContent">
88
+
89
+
90
+
91
+ </div>
92
+
93
+
94
+ </div>
95
+
96
+
97
+ <!-- if includes -->
98
+ <div id="includes">
99
+ <h3 class="section-bar">Included Modules</h3>
100
+
101
+ <div id="includes-list">
102
+ <span class="include-name"><a href="Cartesian.html">Cartesian</a></span>
103
+ <span class="include-name"><a href="Iterable.html">Iterable</a></span>
104
+ <span class="include-name"><a href="GridSearch.html">GridSearch</a></span>
105
+ </div>
106
+ </div>
107
+
108
+ <div id="section">
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+ <!-- if method_list -->
118
+
119
+
120
+ </div>
121
+
122
+
123
+ <div id="validator-badges">
124
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
125
+ </div>
126
+
127
+ </body>
128
+ </html>
@@ -0,0 +1,398 @@
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>Module: Cartesian</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="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Module</strong></td>
53
+ <td class="class-name-in-header">Cartesian</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../files/cartesian_rb.html">
59
+ cartesian.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ </table>
66
+ </div>
67
+ <!-- banner header -->
68
+
69
+ <div id="bodyContent">
70
+
71
+
72
+
73
+ <div id="contextContent">
74
+
75
+ <div id="description">
76
+ <p>
77
+ The <a href="Cartesian.html">Cartesian</a> module provide methods for the
78
+ calculation of the <a href="Cartesian.html#M000024">cartesian</a> producted
79
+ between two enumerable objects.
80
+ </p>
81
+ <p>
82
+ It can also be easily mixed in into any enumerable class, i.e. any class
83
+ with <a href="Enumerable.html">Enumerable</a> module mixed in. Notice that
84
+ the names of the methods for mixin are different.
85
+ </p>
86
+ <p>
87
+ Module:
88
+ </p>
89
+ <pre>
90
+ Cartesian::product(foo, bar)
91
+ </pre>
92
+ <p>
93
+ Mixin:
94
+ </p>
95
+ <pre>
96
+ foo.cartesian( bar )
97
+ </pre>
98
+ <p>
99
+ The module is automatically mixed in <a href="Array.html">Array</a> class.
100
+ </p>
101
+ <h2>Author</h2>
102
+ <p>
103
+ Adriano MITRE &lt;adriano.mitre@gmail.com&gt;
104
+ </p>
105
+ <h2>Example</h2>
106
+ <p>
107
+ as module
108
+ </p>
109
+ <pre>
110
+ require 'cartesian'
111
+ foo = [1, 2]
112
+ bar = [&quot;a&quot;, &quot;b&quot;]
113
+ Cartesian::product(foo, bar) #=&gt; [[1, &quot;a&quot;], [1, &quot;b&quot;], [2, &quot;a&quot;], [2, &quot;b&quot;]]
114
+ </pre>
115
+ <p>
116
+ as mixin
117
+ </p>
118
+ <pre>
119
+ require 'cartesian'
120
+ foo = [1, 2]
121
+ bar = [&quot;a&quot;, &quot;b&quot;]
122
+ foo.cartesian(bar) #=&gt; [[1, &quot;a&quot;], [1, &quot;b&quot;], [2, &quot;a&quot;], [2, &quot;b&quot;]]
123
+ </pre>
124
+
125
+ </div>
126
+
127
+
128
+ </div>
129
+
130
+ <div id="method-list">
131
+ <h3 class="section-bar">Methods</h3>
132
+
133
+ <div class="name-list">
134
+ <a href="#M000027">**</a>&nbsp;&nbsp;
135
+ <a href="#M000024">cartesian</a>&nbsp;&nbsp;
136
+ <a href="#M000022">joined_cartesian</a>&nbsp;&nbsp;
137
+ <a href="#M000021">joined_product</a>&nbsp;&nbsp;
138
+ <a href="#M000026">left_product</a>&nbsp;&nbsp;
139
+ <a href="#M000028">power!</a>&nbsp;&nbsp;
140
+ <a href="#M000020">product</a>&nbsp;&nbsp;
141
+ <a href="#M000025">right_product</a>&nbsp;&nbsp;
142
+ <a href="#M000023">x</a>&nbsp;&nbsp;
143
+ </div>
144
+ </div>
145
+
146
+ </div>
147
+
148
+
149
+ <!-- if includes -->
150
+
151
+ <div id="section">
152
+
153
+
154
+ <div id="constants-list">
155
+ <h3 class="section-bar">Constants</h3>
156
+
157
+ <div class="name-list">
158
+ <table summary="Constants">
159
+ <tr class="top-aligned-row context-row">
160
+ <td class="context-item-name">VERSION</td>
161
+ <td>=</td>
162
+ <td class="context-item-value">'0.5.0'</td>
163
+ </tr>
164
+ </table>
165
+ </div>
166
+ </div>
167
+
168
+
169
+
170
+
171
+
172
+
173
+ <!-- if method_list -->
174
+ <div id="methods">
175
+ <h3 class="section-bar">Public Class methods</h3>
176
+
177
+ <div id="method-M000021" class="method-detail">
178
+ <a name="M000021"></a>
179
+
180
+ <div class="method-heading">
181
+ <a href="Cartesian.src/M000021.html" target="Code" class="method-signature"
182
+ onclick="popupCode('Cartesian.src/M000021.html');return false;">
183
+ <span class="method-name">joined_product</span><span class="method-args">(first, second)</span>
184
+ </a>
185
+ </div>
186
+
187
+ <div class="method-description">
188
+ <p>
189
+ Behaves as <a href="Cartesian.html#M000020">product</a>, except for the
190
+ elements are joined.
191
+ </p>
192
+ <pre>
193
+ Cartesian::joined_cartesian( [1,2], %w(A B) ) #=&gt; [&quot;1A&quot;, &quot;1B&quot;, &quot;2A&quot;, &quot;2B&quot;]
194
+ </pre>
195
+ <p>
196
+ or, if mixed in into <a href="Array.html">Array</a>,
197
+ </p>
198
+ <pre>
199
+ [1,2].joined_cartesian %w(A B) #=&gt; [&quot;1A&quot;, &quot;1B&quot;, &quot;2A&quot;, &quot;2B&quot;]
200
+ </pre>
201
+ </div>
202
+ </div>
203
+
204
+ <div id="method-M000020" class="method-detail">
205
+ <a name="M000020"></a>
206
+
207
+ <div class="method-heading">
208
+ <a href="Cartesian.src/M000020.html" target="Code" class="method-signature"
209
+ onclick="popupCode('Cartesian.src/M000020.html');return false;">
210
+ <span class="method-name">product</span><span class="method-args">(first, second)</span>
211
+ </a>
212
+ </div>
213
+
214
+ <div class="method-description">
215
+ <p>
216
+ Produces the <a href="Cartesian.html#M000024">cartesian</a> <a
217
+ href="Cartesian.html#M000020">product</a> of self and other. The result is
218
+ an array of pairs (i.e. two-element arrays).
219
+ </p>
220
+ <pre>
221
+ Cartesian::product( [1,2], %w(A B) ) #=&gt; [[1, &quot;A&quot;], [1, &quot;B&quot;], [2, &quot;A&quot;], [2, &quot;B&quot;]]
222
+ </pre>
223
+ <p>
224
+ or, if mixed in into <a href="Array.html">Array</a>,
225
+ </p>
226
+ <pre>
227
+ [1,2].cartesian %w(A B) #=&gt; [[1, &quot;A&quot;], [1, &quot;B&quot;], [2, &quot;A&quot;], [2, &quot;B&quot;]]
228
+ </pre>
229
+ </div>
230
+ </div>
231
+
232
+ <h3 class="section-bar">Public Instance methods</h3>
233
+
234
+ <div id="method-M000027" class="method-detail">
235
+ <a name="M000027"></a>
236
+
237
+ <div class="method-heading">
238
+ <a href="Cartesian.src/M000027.html" target="Code" class="method-signature"
239
+ onclick="popupCode('Cartesian.src/M000027.html');return false;">
240
+ <span class="method-name">**</span><span class="method-args">(fixnum)</span>
241
+ </a>
242
+ </div>
243
+
244
+ <div class="method-description">
245
+ <p>
246
+ Concise way of iterating multi-dimensionally over the same array or range.
247
+ </p>
248
+ <p>
249
+ For instance,
250
+ </p>
251
+ <pre>
252
+ for x,y,z in [0,1]**3
253
+ puts [x, y, z].join(',')
254
+ end
255
+ </pre>
256
+ <p>
257
+ produces the following output
258
+ </p>
259
+ <pre>
260
+ 0,0,0
261
+ 0,0,1
262
+ 0,1,0
263
+ 0,1,1
264
+ 1,0,0
265
+ 1,0,1
266
+ 1,1,0
267
+ 1,1,1
268
+ </pre>
269
+ <p>
270
+ It also works with <a href="Range.html">Range</a> objects.
271
+ </p>
272
+ </div>
273
+ </div>
274
+
275
+ <div id="method-M000024" class="method-detail">
276
+ <a name="M000024"></a>
277
+
278
+ <div class="method-heading">
279
+ <span class="method-name">cartesian</span><span class="method-args">(other)</span>
280
+ </div>
281
+
282
+ <div class="method-description">
283
+ <p>
284
+ Alias for <a href="Cartesian.html#M000023">x</a>
285
+ </p>
286
+ </div>
287
+ </div>
288
+
289
+ <div id="method-M000022" class="method-detail">
290
+ <a name="M000022"></a>
291
+
292
+ <div class="method-heading">
293
+ <a href="Cartesian.src/M000022.html" target="Code" class="method-signature"
294
+ onclick="popupCode('Cartesian.src/M000022.html');return false;">
295
+ <span class="method-name">joined_cartesian</span><span class="method-args">(other)</span>
296
+ </a>
297
+ </div>
298
+
299
+ <div class="method-description">
300
+ <p>
301
+ <a href="Cartesian.html#M000021">Cartesian.joined_product</a> for mixin.
302
+ </p>
303
+ </div>
304
+ </div>
305
+
306
+ <div id="method-M000026" class="method-detail">
307
+ <a name="M000026"></a>
308
+
309
+ <div class="method-heading">
310
+ <a href="Cartesian.src/M000026.html" target="Code" class="method-signature"
311
+ onclick="popupCode('Cartesian.src/M000026.html');return false;">
312
+ <span class="method-name">left_product</span><span class="method-args">(other)</span>
313
+ </a>
314
+ </div>
315
+
316
+ <div class="method-description">
317
+ </div>
318
+ </div>
319
+
320
+ <div id="method-M000028" class="method-detail">
321
+ <a name="M000028"></a>
322
+
323
+ <div class="method-heading">
324
+ <span class="method-name">power!</span><span class="method-args">(fixnum)</span>
325
+ </div>
326
+
327
+ <div class="method-description">
328
+ <p>
329
+ Alias for #**
330
+ </p>
331
+ </div>
332
+ </div>
333
+
334
+ <div id="method-M000025" class="method-detail">
335
+ <a name="M000025"></a>
336
+
337
+ <div class="method-heading">
338
+ <span class="method-name">right_product</span><span class="method-args">(other)</span>
339
+ </div>
340
+
341
+ <div class="method-description">
342
+ <p>
343
+ Alias for <a href="Cartesian.html#M000023">x</a>
344
+ </p>
345
+ </div>
346
+ </div>
347
+
348
+ <div id="method-M000023" class="method-detail">
349
+ <a name="M000023"></a>
350
+
351
+ <div class="method-heading">
352
+ <a href="Cartesian.src/M000023.html" target="Code" class="method-signature"
353
+ onclick="popupCode('Cartesian.src/M000023.html');return false;">
354
+ <span class="method-name">x</span><span class="method-args">(other)</span>
355
+ </a>
356
+ </div>
357
+
358
+ <div class="method-description">
359
+ <p>
360
+ Convenient way of iterating over the elements. Preferable when the <a
361
+ href="Cartesian.html#M000024">cartesian</a> <a
362
+ href="Cartesian.html#M000020">product</a> array is not needed, for the
363
+ consumption of memory is fixed and very small, in contrast with the
364
+ exponential memory requirements of the conventional approach.
365
+ </p>
366
+ <pre>
367
+ for row, col in (1..10).x(1..30)
368
+ Matrix[row, col] = row**2 + col**3
369
+ end
370
+ </pre>
371
+ <p>
372
+ Of course, calls can be chained as in
373
+ </p>
374
+ <pre>
375
+ for x, y, z in (1..10).x(1..10).x(1..10)
376
+ # ... do something ...
377
+ end
378
+ </pre>
379
+ <p>
380
+ Beware that both <tt>self</tt> and <tt>other</tt> must implement
381
+ <tt>to_a</tt>, i.e., be convertible to array.
382
+ </p>
383
+ </div>
384
+ </div>
385
+
386
+
387
+ </div>
388
+
389
+
390
+ </div>
391
+
392
+
393
+ <div id="validator-badges">
394
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
395
+ </div>
396
+
397
+ </body>
398
+ </html>