Skip to main content

luaur_reduce_cli/methods/
reducer_generate_spans.rs

1use 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}