Skip to main content

vyre_reference/dual_impls/scan/prefix/
reference.rs

1use crate::{dual_impls::common, workgroup::Memory};
2use vyre_primitives::Scan;
3
4impl common::ReferenceEvaluator for Scan {
5    fn evaluate(&self, inputs: &[Memory]) -> Result<Memory, common::EvalError> {
6        let words = common::u32_words(common::one_input(inputs, "scan")?, "scan")?;
7        let mut iter = words.into_iter();
8        let Some(first) = iter.next() else {
9            return Ok(Memory::from_bytes(Vec::new()));
10        };
11        let mut acc = first;
12        let mut output = vec![acc];
13        for value in iter {
14            acc = common::combine(self.combine, acc, value)?;
15            output.push(acc);
16        }
17        Ok(common::write_u32s(output))
18    }
19}