Cartesian 0.3.0 → 0.4.1

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/cartesian.rb CHANGED
@@ -29,6 +29,7 @@
29
29
  # foo = [1, 2]
30
30
  # bar = ["a", "b"]
31
31
  # foo.cartesian(bar) #=> [[1, "a"], [1, "b"], [2, "a"], [2, "b"]]
32
+ #
32
33
 
33
34
  require 'cartesian_iterator'
34
35
 
@@ -43,28 +44,8 @@ module Cartesian
43
44
  #
44
45
  # [1,2].cartesian %w(A B) #=> [[1, "A"], [1, "B"], [2, "A"], [2, "B"]]
45
46
  #
46
- # optional parameter {:flatten => true}
47
- #
48
- def Cartesian.product(first, second, params={})
49
- params[:flatten] ||= true
50
-
51
- result = []
52
- first.each do |a|
53
- second.each do |b|
54
- if params[:flatten] == true
55
- result << [a, b].flatten
56
- else
57
- result << [a, b]
58
- end
59
- end
60
- end
61
- result
62
- end
63
-
64
- # Cartesian.product for mixin.
65
- #
66
- def cartesian(other, params={})
67
- Cartesian.product(self, other, params)
47
+ def Cartesian.product(first, second)
48
+ first.x(second).to_a
68
49
  end
69
50
 
70
51
  # Behaves as product, except for the elements are joined.
@@ -106,13 +87,29 @@ module Cartesian
106
87
  # for letter, number in %w{a b c}.x(1..3)
107
88
  # ... do something ...
108
89
  # end
109
- #
110
90
  #++
91
+ #
111
92
  # Beware that both +self+ and +other+ must implement
112
93
  # +to_a+, i.e., be convertible to array.
113
94
  #
114
95
  def x(other)
115
- CartesianIterator.new(self, other)
96
+ case other
97
+ when CartesianIterator
98
+ other.left_product(self)
99
+ else
100
+ CartesianIterator.new(self, other)
101
+ end
102
+ end
103
+ alias cartesian x
104
+ alias right_product x
105
+
106
+ def left_product(other)
107
+ case other
108
+ when CartesianIterator
109
+ other.right_product(self)
110
+ else
111
+ CartesianIterator.new(other, self)
112
+ end
116
113
  end
117
114
 
118
115
  # Concise way of iterating multi-dimensionally
@@ -139,7 +136,7 @@ module Cartesian
139
136
  #
140
137
  def **(fixnum)
141
138
  if fixnum < 0
142
- raise ArgumentError, "power must be non-negative"
139
+ raise ArgumentError, "negative power"
143
140
  elsif fixnum == 0
144
141
  return []
145
142
  elsif fixnum == 1
@@ -147,7 +144,7 @@ module Cartesian
147
144
  else
148
145
  iter = CartesianIterator.new(self, self)
149
146
  (fixnum-2).times do
150
- iter.x(self)
147
+ iter.product!(self)
151
148
  end
152
149
  iter
153
150
  end
@@ -3,74 +3,107 @@ require 'grid_search'
3
3
  class CartesianIterator
4
4
 
5
5
  include GridSearch
6
-
7
- def initialize(foo, bar)
8
- @lists = []
9
- @tot_iter = 1
10
- x(foo)
11
- x(bar)
12
- end
13
-
14
- def x(other)
15
- @lists << other.to_a.dup
16
- @tot_iter *= @lists[-1].size
17
- self
18
- end
19
-
20
- def each
21
- return false if @tot_iter < 1
22
-
23
- elems = []
24
- for list in @lists
25
- elems << list.restart_and_raw_next
26
- end
27
- yield *elems
28
-
29
- last_list_index = @lists.size-1
30
- n = last_list_index
31
- loop do
32
- if elems[n] = @lists[n].raw_next
33
- yield *elems
34
- n = last_list_index
35
- next
36
- elsif n > 0
37
- elems[n] = @lists[n].restart_and_raw_next
38
- n -= 1
39
- else
40
- return true
41
- end
42
- end
43
- end
44
-
45
- def to_a
46
- array = []
47
- self.each {|*element| array << element }
48
- array
6
+
7
+ def initialize(foo, bar)
8
+ @lists = []
9
+ @tot_iter = 1
10
+ product!(foo)
11
+ product!(bar)
12
+ end
13
+
14
+ def dup
15
+ Marshal.load(Marshal.dump(self))
16
+ end
17
+
18
+ def equal(other)
19
+ self.instance_variables.each do |var_name|
20
+ return false if self.instance_variable_get(var_name) != other.instance_variable_get(var_name)
21
+ end
22
+ true
23
+ end
24
+ alias == equal
25
+
26
+ def product!(other)
27
+ @lists << other.to_a.dup
28
+ @tot_iter *= @lists[-1].size
29
+ self
30
+ end
31
+ alias right_product! product!
32
+ alias x! product!
33
+
34
+ def left_product!(other)
35
+ @lists.unshift other.to_a.dup
36
+ @tot_iter *= @lists[-1].size
37
+ self
38
+ end
39
+
40
+ def product(other)
41
+ (result = self.dup).product!(other)
42
+ result
43
+ end
44
+ alias right_product product
45
+ alias x product
46
+
47
+ def left_product(other)
48
+ (result = self.dup).left_product!(other)
49
+ result
50
+ end
51
+
52
+ def each
53
+ return false if @tot_iter < 1
54
+
55
+ elems = []
56
+ for list in @lists
57
+ elems << list.restart_and_raw_next
58
+ end
59
+ yield *elems
60
+
61
+ last_list_index = @lists.size-1
62
+ n = last_list_index
63
+ loop do
64
+ if elems[n] = @lists[n].raw_next
65
+ yield *elems
66
+ n = last_list_index
67
+ next
68
+ elsif n > 0
69
+ elems[n] = @lists[n].restart_and_raw_next
70
+ n -= 1
71
+ else
72
+ return true
73
+ end
74
+ end
75
+ end
76
+
77
+ def to_a
78
+ array = []
79
+ self.each {|*element| array << element }
80
+ array
81
+ end
82
+ alias to_ary to_a
83
+
84
+ end
85
+
86
+ module Iterable
87
+ def restart
88
+ @next_index = -1
89
+ true
90
+ end
91
+ alias start restart
92
+
93
+ def next
94
+ @next_index or restart
95
+ raw_next
96
+ end
97
+
98
+ def raw_next
99
+ self[@next_index += 1]
100
+ end
101
+
102
+ def restart_and_raw_next
103
+ self[@next_index = 0]
49
104
  end
105
+ end
50
106
 
51
- end
52
-
53
- module Iterable
54
- def start
55
- @next_index = -1
56
- true
57
- end
58
- alias :restart :start
59
-
60
- def next
61
- @next_index or restart
62
- raw_next
63
- end
64
-
65
- def raw_next
66
- self[@next_index += 1]
67
- end
68
-
69
- def restart_and_raw_next
70
- self[@next_index = 0]
71
- end
72
- end
73
-
74
- class Array
75
- include Iterable
76
- end
107
+ class Array
108
+ include Iterable
109
+ end
data/lib/recursive.rb ADDED
@@ -0,0 +1,8 @@
1
+ # Code by Brian Schröäer
2
+ # source: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/151857
3
+ #
4
+ def cartprod(base, *others)
5
+ return base.map { |a| [a] } if others.empty?
6
+ others = cartprod(*others)
7
+ base.inject([]) { | r, a | others.inject(r) { | r, b | r << ([a,*b]) } }
8
+ end
@@ -0,0 +1,308 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'>
3
+ <head>
4
+ <title>
5
+ /home/adriano/software/ruby/Cartesian/lib/cartesian_iterator.rb - C0 code
6
+ coverage information
7
+ </title>
8
+ <style type='text/css'>
9
+ body { background-color: rgb(240, 240, 245); }
10
+ </style>
11
+ <style type='text/css'>
12
+ span.cross-ref-title { font-size: 140%; } span.cross-ref a {
13
+ text-decoration: none; } span.cross-ref { background-color:#f3f7fa;
14
+ border: 1px dashed #333; margin: 1em; padding: 0.5em; overflow: hidden; }
15
+ a.crossref-toggle { text-decoration: none; } span.marked0 {
16
+ background-color: rgb(185, 210, 200); display: block; } span.marked1 {
17
+ background-color: rgb(190, 215, 205); display: block; } span.inferred0 {
18
+ background-color: rgb(175, 200, 200); display: block; } span.inferred1 {
19
+ background-color: rgb(180, 205, 205); display: block; } span.uncovered0 {
20
+ background-color: rgb(225, 110, 110); display: block; } span.uncovered1 {
21
+ background-color: rgb(235, 120, 120); display: block; } span.overview {
22
+ border-bottom: 8px solid black; } div.overview { border-bottom: 8px solid
23
+ black; } body { font-family: verdana, arial, helvetica; } div.footer {
24
+ font-size: 68%; margin-top: 1.5em; } h1, h2, h3, h4, h5, h6 {
25
+ margin-bottom: 0.5em; } h5 { margin-top: 0.5em; } .hidden { display: none;
26
+ } div.separator { height: 10px; } /* Commented out for better readability,
27
+ esp. on IE */ /* table tr td, table tr th { font-size: 68%; } td.value
28
+ table tr td { font-size: 11px; } */ table.percent_graph { height: 12px;
29
+ border: #808080 1px solid; empty-cells: show; } table.percent_graph
30
+ td.covered { height: 10px; background: #00f000; } table.percent_graph
31
+ td.uncovered { height: 10px; background: #e00000; } table.percent_graph
32
+ td.NA { height: 10px; background: #eaeaea; } table.report {
33
+ border-collapse: collapse; width: 100%; } table.report td.heading {
34
+ background: #dcecff; border: #d0d0d0 1px solid; font-weight: bold;
35
+ text-align: center; } table.report td.heading:hover { background: #c0ffc0;
36
+ } table.report td.text { border: #d0d0d0 1px solid; } table.report
37
+ td.value, table.report td.lines_total, table.report td.lines_code {
38
+ text-align: right; border: #d0d0d0 1px solid; } table.report tr.light {
39
+ background-color: rgb(240, 240, 245); } table.report tr.dark {
40
+ background-color: rgb(230, 230, 235); }
41
+ </style>
42
+ <script type='text/javascript'>
43
+ // <![CDATA[ function toggleCode( id ) { if ( document.getElementById )
44
+ elem = document.getElementById( id ); else if ( document.all ) elem =
45
+ eval( "document.all." + id ); else return false; elemStyle = elem.style;
46
+ if ( elemStyle.display != "block" ) { elemStyle.display = "block" } else {
47
+ elemStyle.display = "none" } return true; } // Make cross-references
48
+ hidden by default document.writeln( "<style
49
+ type=\"text/css\">span.cross-ref { display: none }</style>" ) // ]]>
50
+ </script>
51
+ <style type='text/css'>
52
+ span.run0 { background-color: rgb(178, 204, 255); display: block; }
53
+ span.run1 { background-color: rgb(178, 206, 255); display: block; }
54
+ span.run2 { background-color: rgb(178, 209, 255); display: block; }
55
+ span.run3 { background-color: rgb(178, 211, 255); display: block; }
56
+ span.run4 { background-color: rgb(178, 214, 255); display: block; }
57
+ span.run5 { background-color: rgb(178, 218, 255); display: block; }
58
+ span.run6 { background-color: rgb(178, 220, 255); display: block; }
59
+ span.run7 { background-color: rgb(178, 223, 255); display: block; }
60
+ span.run8 { background-color: rgb(178, 225, 255); display: block; }
61
+ span.run9 { background-color: rgb(178, 228, 255); display: block; }
62
+ span.run10 { background-color: rgb(178, 232, 255); display: block; }
63
+ span.run11 { background-color: rgb(178, 234, 255); display: block; }
64
+ span.run12 { background-color: rgb(178, 237, 255); display: block; }
65
+ span.run13 { background-color: rgb(178, 239, 255); display: block; }
66
+ span.run14 { background-color: rgb(178, 242, 255); display: block; }
67
+ span.run15 { background-color: rgb(178, 246, 255); display: block; }
68
+ span.run16 { background-color: rgb(178, 248, 255); display: block; }
69
+ span.run17 { background-color: rgb(178, 251, 255); display: block; }
70
+ span.run18 { background-color: rgb(178, 253, 255); display: block; }
71
+ span.run19 { background-color: rgb(178, 255, 253); display: block; }
72
+ span.run20 { background-color: rgb(178, 255, 249); display: block; }
73
+ span.run21 { background-color: rgb(178, 255, 247); display: block; }
74
+ span.run22 { background-color: rgb(178, 255, 244); display: block; }
75
+ span.run23 { background-color: rgb(178, 255, 242); display: block; }
76
+ span.run24 { background-color: rgb(178, 255, 239); display: block; }
77
+ span.run25 { background-color: rgb(178, 255, 235); display: block; }
78
+ span.run26 { background-color: rgb(178, 255, 233); display: block; }
79
+ span.run27 { background-color: rgb(178, 255, 230); display: block; }
80
+ span.run28 { background-color: rgb(178, 255, 228); display: block; }
81
+ span.run29 { background-color: rgb(178, 255, 225); display: block; }
82
+ span.run30 { background-color: rgb(178, 255, 221); display: block; }
83
+ span.run31 { background-color: rgb(178, 255, 219); display: block; }
84
+ span.run32 { background-color: rgb(178, 255, 216); display: block; }
85
+ span.run33 { background-color: rgb(178, 255, 214); display: block; }
86
+ span.run34 { background-color: rgb(178, 255, 211); display: block; }
87
+ span.run35 { background-color: rgb(178, 255, 207); display: block; }
88
+ span.run36 { background-color: rgb(178, 255, 205); display: block; }
89
+ span.run37 { background-color: rgb(178, 255, 202); display: block; }
90
+ span.run38 { background-color: rgb(178, 255, 200); display: block; }
91
+ span.run39 { background-color: rgb(178, 255, 197); display: block; }
92
+ span.run40 { background-color: rgb(178, 255, 193); display: block; }
93
+ span.run41 { background-color: rgb(178, 255, 191); display: block; }
94
+ span.run42 { background-color: rgb(178, 255, 188); display: block; }
95
+ span.run43 { background-color: rgb(178, 255, 186); display: block; }
96
+ span.run44 { background-color: rgb(178, 255, 183); display: block; }
97
+ span.run45 { background-color: rgb(178, 255, 179); display: block; }
98
+ span.run46 { background-color: rgb(179, 255, 178); display: block; }
99
+ span.run47 { background-color: rgb(182, 255, 178); display: block; }
100
+ span.run48 { background-color: rgb(184, 255, 178); display: block; }
101
+ span.run49 { background-color: rgb(187, 255, 178); display: block; }
102
+ span.run50 { background-color: rgb(191, 255, 178); display: block; }
103
+ span.run51 { background-color: rgb(193, 255, 178); display: block; }
104
+ span.run52 { background-color: rgb(196, 255, 178); display: block; }
105
+ span.run53 { background-color: rgb(198, 255, 178); display: block; }
106
+ span.run54 { background-color: rgb(201, 255, 178); display: block; }
107
+ span.run55 { background-color: rgb(205, 255, 178); display: block; }
108
+ span.run56 { background-color: rgb(207, 255, 178); display: block; }
109
+ span.run57 { background-color: rgb(210, 255, 178); display: block; }
110
+ span.run58 { background-color: rgb(212, 255, 178); display: block; }
111
+ span.run59 { background-color: rgb(215, 255, 178); display: block; }
112
+ span.run60 { background-color: rgb(219, 255, 178); display: block; }
113
+ span.run61 { background-color: rgb(221, 255, 178); display: block; }
114
+ span.run62 { background-color: rgb(224, 255, 178); display: block; }
115
+ span.run63 { background-color: rgb(226, 255, 178); display: block; }
116
+ span.run64 { background-color: rgb(229, 255, 178); display: block; }
117
+ span.run65 { background-color: rgb(233, 255, 178); display: block; }
118
+ span.run66 { background-color: rgb(235, 255, 178); display: block; }
119
+ span.run67 { background-color: rgb(238, 255, 178); display: block; }
120
+ span.run68 { background-color: rgb(240, 255, 178); display: block; }
121
+ span.run69 { background-color: rgb(243, 255, 178); display: block; }
122
+ span.run70 { background-color: rgb(247, 255, 178); display: block; }
123
+ span.run71 { background-color: rgb(249, 255, 178); display: block; }
124
+ span.run72 { background-color: rgb(252, 255, 178); display: block; }
125
+ span.run73 { background-color: rgb(255, 255, 178); display: block; }
126
+ span.run74 { background-color: rgb(255, 252, 178); display: block; }
127
+ span.run75 { background-color: rgb(255, 248, 178); display: block; }
128
+ span.run76 { background-color: rgb(255, 246, 178); display: block; }
129
+ span.run77 { background-color: rgb(255, 243, 178); display: block; }
130
+ span.run78 { background-color: rgb(255, 240, 178); display: block; }
131
+ span.run79 { background-color: rgb(255, 238, 178); display: block; }
132
+ span.run80 { background-color: rgb(255, 234, 178); display: block; }
133
+ span.run81 { background-color: rgb(255, 232, 178); display: block; }
134
+ span.run82 { background-color: rgb(255, 229, 178); display: block; }
135
+ span.run83 { background-color: rgb(255, 226, 178); display: block; }
136
+ span.run84 { background-color: rgb(255, 224, 178); display: block; }
137
+ span.run85 { background-color: rgb(255, 220, 178); display: block; }
138
+ span.run86 { background-color: rgb(255, 218, 178); display: block; }
139
+ span.run87 { background-color: rgb(255, 215, 178); display: block; }
140
+ span.run88 { background-color: rgb(255, 212, 178); display: block; }
141
+ span.run89 { background-color: rgb(255, 210, 178); display: block; }
142
+ span.run90 { background-color: rgb(255, 206, 178); display: block; }
143
+ span.run91 { background-color: rgb(255, 204, 178); display: block; }
144
+ span.run92 { background-color: rgb(255, 201, 178); display: block; }
145
+ span.run93 { background-color: rgb(255, 198, 178); display: block; }
146
+ span.run94 { background-color: rgb(255, 196, 178); display: block; }
147
+ span.run95 { background-color: rgb(255, 192, 178); display: block; }
148
+ span.run96 { background-color: rgb(255, 189, 178); display: block; }
149
+ span.run97 { background-color: rgb(255, 187, 178); display: block; }
150
+ span.run98 { background-color: rgb(255, 184, 178); display: block; }
151
+ span.run99 { background-color: rgb(255, 182, 178); display: block; }
152
+ span.run100 { background-color: rgb(255, 178, 178); display: block; }
153
+ </style>
154
+ </head>
155
+ <body>
156
+ <h3>
157
+ C0 code coverage information
158
+ </h3>
159
+ <p>
160
+ Generated on Tue Nov 04 04:48:28 -0200 2008 with
161
+ <a href='http://eigenclass.org/hiki/rcov'>
162
+ rcov 0.8.1.2
163
+ </a>
164
+ </p>
165
+ <hr />
166
+ <pre><span class='marked0'>Code reported as executed by Ruby looks like
167
+ this... </span><span class='marked1'>and this: this line is also marked as
168
+ covered. </span><span class='inferred0'>Lines considered as run by rcov, but
169
+ not reported by Ruby, look like this, </span><span class='inferred1'>and
170
+ this: these lines were inferred by rcov (using simple heuristics).
171
+ </span><span class='uncovered0'>Finally, here&apos;s a line marked as not
172
+ executed. </span></pre>
173
+ <table class='report'> <thead> <tr> <td class='heading'> Name </td> <td
174
+ class='heading'> Total lines </td> <td class='heading'> Lines of code </td>
175
+ <td class='heading'> Total coverage </td> <td class='heading'> Code coverage
176
+ </td> </tr> </thead> <tbody> <tr class='light'> <td> <a
177
+ href='-home-adriano-software-ruby-Cartesian-lib-cartesian_iterator_rb.html'>
178
+ /home/adriano/software/ruby/Cartesian/lib/cartesian_iterator.rb </a> </td>
179
+ <td class='lines_total'> <tt> 108 </tt> </td> <td class='lines_code'> <tt>
180
+ 89 </tt> </td> <td> <table cellspacing='0' align='right' cellpadding='0'>
181
+ <tr> <td> <tt class='coverage_total'> 100.0% </tt> &nbsp; </td> <td> <table
182
+ class='percent_graph' cellspacing='0' width='100' cellpadding='0'> <tr> <td
183
+ class='covered' width='100' /> <td class='uncovered' width='0' /> </tr>
184
+ </table> </td> </tr> </table> </td> <td> <table cellspacing='0'
185
+ align='right' cellpadding='0'> <tr> <td> <tt class='coverage_code'> 100.0%
186
+ </tt> &nbsp; </td> <td> <table class='percent_graph' cellspacing='0'
187
+ width='100' cellpadding='0'> <tr> <td class='covered' width='100' /> <td
188
+ class='uncovered' width='0' /> </tr> </table> </td> </tr> </table> </td>
189
+ </tr> </tbody> </table><pre><span class="marked0"><a name="line1"></a> 1
190
+ require 'grid_search' </span><span class="inferred1"><a name="line2"></a> 2
191
+ </span><span class="marked0"><a name="line3"></a> 3 class CartesianIterator
192
+ </span><span class="inferred1"><a name="line4"></a> 4 </span><span
193
+ class="marked0"><a name="line5"></a> 5 include GridSearch </span><span
194
+ class="inferred1"><a name="line6"></a> 6 </span><span class="marked0"><a
195
+ name="line7"></a> 7 def initialize(foo, bar) </span><span class="marked1"><a
196
+ name="line8"></a> 8 @lists = [] </span><span class="marked0"><a
197
+ name="line9"></a> 9 @tot_iter = 1 </span><span class="marked1"><a
198
+ name="line10"></a> 10 product!(foo) </span><span class="marked0"><a
199
+ name="line11"></a> 11 product!(bar) </span><span class="inferred1"><a
200
+ name="line12"></a> 12 end </span><span class="inferred0"><a
201
+ name="line13"></a> 13 </span><span class="marked1"><a name="line14"></a> 14
202
+ def dup </span><span class="marked0"><a name="line15"></a> 15
203
+ Marshal.load(Marshal.dump(self)) </span><span class="inferred1"><a
204
+ name="line16"></a> 16 end </span><span class="inferred0"><a
205
+ name="line17"></a> 17 </span><span class="marked1"><a name="line18"></a> 18
206
+ def equal(other) </span><span class="marked0"><a name="line19"></a> 19
207
+ self.instance_variables.each do |var_name| </span><span class="marked1"><a
208
+ name="line20"></a> 20 return false if self.instance_variable_get(var_name)
209
+ != other.instance_variable_get(var_name) </span><span class="inferred0"><a
210
+ name="line21"></a> 21 end </span><span class="marked1"><a name="line22"></a>
211
+ 22 true </span><span class="inferred0"><a name="line23"></a> 23 end
212
+ </span><span class="marked1"><a name="line24"></a> 24 alias == equal
213
+ </span><span class="inferred0"><a name="line25"></a> 25 </span><span
214
+ class="marked1"><a name="line26"></a> 26 def product!(other) </span><span
215
+ class="marked0"><a name="line27"></a> 27 @lists &lt;&lt; other.to_a.dup
216
+ </span><span class="marked1"><a name="line28"></a> 28 @tot_iter *=
217
+ @lists[-1].size </span><span class="marked0"><a name="line29"></a> 29 self
218
+ </span><span class="inferred1"><a name="line30"></a> 30 end </span><span
219
+ class="marked0"><a name="line31"></a> 31 alias right_product! product!
220
+ </span><span class="marked1"><a name="line32"></a> 32 alias x! product!
221
+ </span><span class="inferred0"><a name="line33"></a> 33 </span><span
222
+ class="marked1"><a name="line34"></a> 34 def left_product!(other)
223
+ </span><span class="marked0"><a name="line35"></a> 35 @lists.unshift
224
+ other.to_a.dup </span><span class="marked1"><a name="line36"></a> 36
225
+ @tot_iter *= @lists[-1].size </span><span class="marked0"><a
226
+ name="line37"></a> 37 self </span><span class="inferred1"><a
227
+ name="line38"></a> 38 end </span><span class="inferred0"><a
228
+ name="line39"></a> 39 </span><span class="marked1"><a name="line40"></a> 40
229
+ def product(other) </span><span class="marked0"><a name="line41"></a> 41
230
+ (result = self.dup).product!(other) </span><span class="marked1"><a
231
+ name="line42"></a> 42 result </span><span class="inferred0"><a
232
+ name="line43"></a> 43 end </span><span class="marked1"><a name="line44"></a>
233
+ 44 alias right_product product </span><span class="marked0"><a
234
+ name="line45"></a> 45 alias x product </span><span class="inferred1"><a
235
+ name="line46"></a> 46 </span><span class="marked0"><a name="line47"></a> 47
236
+ def left_product(other) </span><span class="marked1"><a name="line48"></a>
237
+ 48 (result = self.dup).left_product!(other) </span><span class="marked0"><a
238
+ name="line49"></a> 49 result </span><span class="inferred1"><a
239
+ name="line50"></a> 50 end </span><span class="inferred0"><a
240
+ name="line51"></a> 51 </span><span class="marked1"><a name="line52"></a> 52
241
+ def each </span><span class="marked0"><a name="line53"></a> 53 return false
242
+ if @tot_iter &lt; 1 </span><span class="inferred1"><a name="line54"></a> 54
243
+ </span><span class="marked0"><a name="line55"></a> 55 elems = []
244
+ </span><span class="marked1"><a name="line56"></a> 56 for list in @lists
245
+ </span><span class="marked0"><a name="line57"></a> 57 elems &lt;&lt;
246
+ list.restart_and_raw_next </span><span class="inferred1"><a
247
+ name="line58"></a> 58 end </span><span class="marked0"><a name="line59"></a>
248
+ 59 yield *elems </span><span class="inferred1"><a name="line60"></a> 60
249
+ </span><span class="marked0"><a name="line61"></a> 61 last_list_index =
250
+ @lists.size-1 </span><span class="marked1"><a name="line62"></a> 62 n =
251
+ last_list_index </span><span class="marked0"><a name="line63"></a> 63 loop
252
+ do </span><span class="marked1"><a name="line64"></a> 64 if elems[n] =
253
+ @lists[n].raw_next </span><span class="marked0"><a name="line65"></a> 65
254
+ yield *elems </span><span class="marked1"><a name="line66"></a> 66 n =
255
+ last_list_index </span><span class="marked0"><a name="line67"></a> 67 next
256
+ </span><span class="marked1"><a name="line68"></a> 68 elsif n &gt; 0
257
+ </span><span class="marked0"><a name="line69"></a> 69 elems[n] =
258
+ @lists[n].restart_and_raw_next </span><span class="marked1"><a
259
+ name="line70"></a> 70 n -= 1 </span><span class="inferred0"><a
260
+ name="line71"></a> 71 else </span><span class="marked1"><a
261
+ name="line72"></a> 72 return true </span><span class="inferred0"><a
262
+ name="line73"></a> 73 end </span><span class="inferred1"><a
263
+ name="line74"></a> 74 end </span><span class="inferred0"><a
264
+ name="line75"></a> 75 end </span><span class="inferred1"><a
265
+ name="line76"></a> 76 </span><span class="marked0"><a name="line77"></a> 77
266
+ def to_a </span><span class="marked1"><a name="line78"></a> 78 array = []
267
+ </span><span class="marked0"><a name="line79"></a> 79 self.each {|*element|
268
+ array &lt;&lt; element } </span><span class="marked1"><a name="line80"></a>
269
+ 80 array </span><span class="inferred0"><a name="line81"></a> 81 end
270
+ </span><span class="inferred1"><a name="line82"></a> 82 </span><span
271
+ class="inferred0"><a name="line83"></a> 83 end </span><span
272
+ class="inferred1"><a name="line84"></a> 84 </span><span class="marked0"><a
273
+ name="line85"></a> 85 module Iterable </span><span class="marked1"><a
274
+ name="line86"></a> 86 def restart </span><span class="marked0"><a
275
+ name="line87"></a> 87 @next_index = -1 </span><span class="marked1"><a
276
+ name="line88"></a> 88 true </span><span class="inferred0"><a
277
+ name="line89"></a> 89 end </span><span class="marked1"><a name="line90"></a>
278
+ 90 alias start restart </span><span class="inferred0"><a name="line91"></a>
279
+ 91 </span><span class="marked1"><a name="line92"></a> 92 def next
280
+ </span><span class="marked0"><a name="line93"></a> 93 @next_index or restart
281
+ </span><span class="marked1"><a name="line94"></a> 94 raw_next </span><span
282
+ class="inferred0"><a name="line95"></a> 95 end </span><span
283
+ class="inferred1"><a name="line96"></a> 96 </span><span class="marked0"><a
284
+ name="line97"></a> 97 def raw_next </span><span class="marked1"><a
285
+ name="line98"></a> 98 self[@next_index += 1] </span><span
286
+ class="inferred0"><a name="line99"></a> 99 end </span><span
287
+ class="inferred1"><a name="line100"></a>100 </span><span class="marked0"><a
288
+ name="line101"></a>101 def restart_and_raw_next </span><span
289
+ class="marked1"><a name="line102"></a>102 self[@next_index = 0] </span><span
290
+ class="inferred0"><a name="line103"></a>103 end </span><span
291
+ class="inferred1"><a name="line104"></a>104 end </span><span
292
+ class="inferred0"><a name="line105"></a>105 </span><span class="marked1"><a
293
+ name="line106"></a>106 class Array </span><span class="marked0"><a
294
+ name="line107"></a>107 include Iterable </span><span class="inferred1"><a
295
+ name="line108"></a>108 end </span></pre>
296
+ <hr />
297
+ <p> Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'> rcov
298
+ code coverage analysis tool for Ruby </a> version 0.8.1.2. </p>
299
+ <p>
300
+ <a href='http://validator.w3.org/check/referer'>
301
+ <img src='http://www.w3.org/Icons/valid-xhtml10' height='31' alt='Valid XHTML 1.0!' width='88' />
302
+ </a>
303
+ <a href='http://jigsaw.w3.org/css-validator/check/referer'>
304
+ <img src='http://jigsaw.w3.org/css-validator/images/vcss' alt='Valid CSS!' style='border:0;width:88px;height:31px' />
305
+ </a>
306
+ </p>
307
+ </body>
308
+ </html>