This documentation is automatically generated by online-judge-tools/verification-helper
require "spec"
require "../../src/tuple/times"
describe Tuple do
it "#times(&block)" do
result = [] of {Int32, Int32, Int32}
{1, 2, 3}.times do |i, j, k|
result << {i, j, k}
end
result.should eq [
{0, 0, 0}, {0, 0, 1}, {0, 0, 2},
{0, 1, 0}, {0, 1, 1}, {0, 1, 2},
]
result = [] of {Int32, Int32, Int64}
{1, 2, 3i64}.times do |i, j, k|
result << {i, j, k}
end
result.should eq [
{0, 0, 0}, {0, 0, 1}, {0, 0, 2},
{0, 1, 0}, {0, 1, 1}, {0, 1, 2},
]
end
it "#times" do
{1, 2, 3}.times.to_a.should eq [
{0, 0, 0}, {0, 0, 1}, {0, 0, 2},
{0, 1, 0}, {0, 1, 1}, {0, 1, 2},
]
{1, 2u8, 3i64}.times.to_a.should eq [
{0, 0, 0}, {0, 0, 1}, {0, 0, 2},
{0, 1, 0}, {0, 1, 1}, {0, 1, 2},
]
{1, 2u8, 3i64}.times.each do |i, j, k|
i.should be_a Int32
j.should be_a UInt8
k.should be_a Int64
end
end
end
require "spec"
# require "../../src/tuple/times"
struct Tuple
def times(&block) : Nil
{% begin %}
{% for i in 0...@type.size %}
self[{{i}}].times do |i{{i}}|
{% end %}
yield({% for i in 0...@type.size %} i{{i}}, {% end %})
{% for i in 0...@type.size %}
end
{% end %}
{% end %}
end
private class TimesIterator(T)
include Iterator(T)
def initialize(@n : T)
tuple = {% begin %} { {% for type in T %} {{type}}.zero, {% end %} } {% end %}
@index = tuple.as(T)
@first = true
end
def next
if @first
@first = false
return @index
end
{% begin %}
{%
type = @type.type_vars[0]
size = type.size
%}
{% for i in 1..size %}
if @index[{{size - i}}] < @n[{{size - i}}] - 1
@index = {
{% for j in 0...size %}
{% if j < size - i %}
@index[{{j}}],
{% elsif j == size - i %}
@index[{{j}}] + 1,
{% else %}
{{type[j]}}.zero,
{% end %}
{% end %}
}
return @index
end
{% end %}
stop
{% end %}
end
end
def times
TimesIterator(self).new(self)
end
end
describe Tuple do
it "#times(&block)" do
result = [] of {Int32, Int32, Int32}
{1, 2, 3}.times do |i, j, k|
result << {i, j, k}
end
result.should eq [
{0, 0, 0}, {0, 0, 1}, {0, 0, 2},
{0, 1, 0}, {0, 1, 1}, {0, 1, 2},
]
result = [] of {Int32, Int32, Int64}
{1, 2, 3i64}.times do |i, j, k|
result << {i, j, k}
end
result.should eq [
{0, 0, 0}, {0, 0, 1}, {0, 0, 2},
{0, 1, 0}, {0, 1, 1}, {0, 1, 2},
]
end
it "#times" do
{1, 2, 3}.times.to_a.should eq [
{0, 0, 0}, {0, 0, 1}, {0, 0, 2},
{0, 1, 0}, {0, 1, 1}, {0, 1, 2},
]
{1, 2u8, 3i64}.times.to_a.should eq [
{0, 0, 0}, {0, 0, 1}, {0, 0, 2},
{0, 1, 0}, {0, 1, 1}, {0, 1, 2},
]
{1, 2u8, 3i64}.times.each do |i, j, k|
i.should be_a Int32
j.should be_a UInt8
k.should be_a Int64
end
end
end