Wraps an iterator of sub-iterators and iterates over the elements of the sub-iterators.
var i: Iterator[Int]
var empty = new Array[Int]
i = new Iterator2[Int]([
[1, 2, 3].iterator,
empty.iterator,
[4, 5].iterator
].iterator)
assert i.to_a == [1, 2, 3, 4, 5]
i = new Iterator2[Int]([
empty.iterator,
[42].iterator,
empty.iterator
].iterator)
assert i.to_a == [42]
SEE: +
pipeline :: Iterator2 :: defaultinit
core :: Object :: class_factory
Implementation used byget_class
to create the specific class.
pipeline :: Iterator2 :: defaultinit
core :: Object :: defaultinit
core :: Iterator :: defaultinit
core :: Object :: is_same_instance
Return true ifself
and other
are the same instance (i.e. same identity).
core :: Object :: is_same_serialized
Isself
the same as other
in a serialization context?
core :: Object :: is_same_type
Return true ifself
and other
have the same dynamic type.
Iterator
whose elements are sorted by the function
core :: Object :: output_class_name
Display class name on stdout (debug only).
# Concatenates a sequence of iterators.
#
# Wraps an iterator of sub-iterators and iterates over the elements of the
# sub-iterators.
#
# ~~~nit
# var i: Iterator[Int]
# var empty = new Array[Int]
#
# i = new Iterator2[Int]([
# [1, 2, 3].iterator,
# empty.iterator,
# [4, 5].iterator
# ].iterator)
# assert i.to_a == [1, 2, 3, 4, 5]
#
# i = new Iterator2[Int]([
# empty.iterator,
# [42].iterator,
# empty.iterator
# ].iterator)
# assert i.to_a == [42]
# ~~~
#
# SEE: `Iterator::+`
class Iterator2[E]
super Iterator[E]
# The inner iterator over sub-iterators.
var inner: Iterator[Iterator[E]]
redef fun finish
do
var i = current_iterator
if i != null then i.finish
end
redef fun is_ok
do
var i = current_iterator
if i == null then return false
return i.is_ok
end
redef fun item
do
var i = current_iterator
assert i != null
return i.item
end
redef fun next
do
var i = current_iterator
assert i != null
i.next
end
redef fun start
do
var i = current_iterator
if i != null then i.start
end
private var previous_iterator: nullable Iterator[E] = null
private fun current_iterator: nullable Iterator[E]
do
if previous_iterator == null then
# Get the first sub-iterator.
if inner.is_ok then
previous_iterator = inner.item
previous_iterator.start
inner.next
else
return null
end
end
# Get the first sub-iterator that has a current item.
while inner.is_ok and not previous_iterator.is_ok do
previous_iterator.finish
previous_iterator = inner.item
previous_iterator.start
inner.next
end
return previous_iterator
end
end
lib/pipeline/pipeline.nit:164,1--251,3