Skip to content

Commit 5630daf

Browse files
Add iterator implementation for ConcatenatedListView
- Introduce `ConcatenatedListViewIterator` to enable iteration without materializing combined lists. - Optimize nested list handling by directly traversing inner `ConcatenatedListView` instances.
1 parent 4e59e09 commit 5630daf

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

core/common/src/internal/format/parser/ConcatenatedListView.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,32 @@ internal class ConcatenatedListView<T>(val list1: List<T>, val list2: List<T>) :
1010
get() = list1.size + list2.size
1111

1212
override fun get(index: Int): T = if (index < list1.size) list1[index] else list2[index - list1.size]
13+
14+
override fun iterator(): Iterator<T> = ConcatenatedListViewIterator()
15+
16+
private inner class ConcatenatedListViewIterator : Iterator<T> {
17+
private val iterators: List<Iterator<T>> = buildList {
18+
collectIterators(list1)
19+
collectIterators(list2)
20+
}
21+
private var index = 0
22+
23+
private fun MutableList<Iterator<T>>.collectIterators(list: List<T>) {
24+
if (list is ConcatenatedListView<T>) {
25+
collectIterators(list.list1)
26+
collectIterators(list.list2)
27+
} else {
28+
add(list.iterator())
29+
}
30+
}
31+
32+
override fun hasNext(): Boolean {
33+
while (index < iterators.size && !iterators[index].hasNext()) {
34+
index++
35+
}
36+
return index < iterators.size
37+
}
38+
39+
override fun next(): T = iterators[index].next()
40+
}
1341
}

0 commit comments

Comments
 (0)