luaur_reduce_cli/methods/
reducer_generate_spans.rs1use alloc::vec::Vec;
2use core::cmp::{max, min};
3use luaur_common::macros::luau_assert::LUAU_ASSERT;
4
5use crate::records::reducer::Reducer;
6use crate::type_aliases::span::Span;
7
8impl Reducer {
9 pub fn generate_spans(&self, size: usize, chunks: usize) -> Vec<(Span, Span)> {
10 if size <= 1 {
11 return Vec::new();
12 }
13
14 LUAU_ASSERT!(chunks > 0);
15 let chunk_length = max(1, size / chunks);
16
17 let mut result: Vec<(Span, Span)> = Vec::new();
18
19 let mut append = |a: Span, b: Span| {
20 if a.0 == a.1 && b.0 == b.1 {
21 return;
22 } else {
23 result.push((a, b));
24 }
25 };
26
27 let mut i = 0;
28 while i < size {
29 let end = min(i + chunk_length, size);
30 append((0, i), (end, size));
31
32 i = end;
33 }
34
35 i = 0;
36 while i < size {
37 let end = min(i + chunk_length, size);
38 append((i, end), (size, size));
39
40 i = end;
41 }
42
43 result
44 }
45}
46
47pub fn reducer_generate_spans(this: &Reducer, size: usize, chunks: usize) -> Vec<(Span, Span)> {
48 this.generate_spans(size, chunks)
49}