///| Source-shaped in-process builder for contiguous token batches.
///
/// Source:
/// `vscode/src/vs/editor/common/tokens/contiguousMultilineTokensBuilder.ts`
/// at checked-in oracle, consumed
/// closure lines 9 and 21-41. Worker serialization remains outside the
/// readonly Viewer boundary.
///|
/// Collects adjacent one-based lines into ordered contiguous batches.
/// Source: `contiguousMultilineTokensBuilder.ts:9,21`.
struct ContiguousMultilineTokensBuilder {
tokens : Array[ContiguousMultilineTokens]
}
///|
/// Creates an empty collector.
/// Source: `contiguousMultilineTokensBuilder.ts:23-25`.
pub fn ContiguousMultilineTokensBuilder::ContiguousMultilineTokensBuilder() -> ContiguousMultilineTokensBuilder {
{ tokens: [], }
}
///|
/// Appends to the final batch only when `line_number` is its exact successor;
/// gaps and out-of-order lines begin a new batch.
/// Source: `contiguousMultilineTokensBuilder.ts:27-37`.
pub fn ContiguousMultilineTokensBuilder::add(
self : ContiguousMultilineTokensBuilder,
line_number : Int32,
line_tokens : Array[UInt32],
) -> Unit {
if self.tokens is [.., last] && last.end_line_number() + 1 == line_number {
last.append_line_tokens(line_tokens)
return
}
self.tokens.push(ContiguousMultilineTokens(line_number, [line_tokens]))
}
///|
/// Returns the accumulated batches in insertion order without copying them.
/// Source: `contiguousMultilineTokensBuilder.ts:39-41`.
pub fn ContiguousMultilineTokensBuilder::finalize(
self : ContiguousMultilineTokensBuilder,
) -> Array[ContiguousMultilineTokens] {
self.tokens
}