1mod active;
4mod addends;
5mod atoms;
6mod blocks;
7mod column;
8mod lines;
9mod point;
10pub mod run;
11mod tail;
12mod truncate;
13
14use sva_formula::{Body, C64, SpectralSum};
15
16use crate::error::CollapseError;
17
18pub use blocks::Rows;
19pub(crate) use column::Program;
20pub use lines::summed_bounds;
21pub use point::{At, crop_gain, lane_of, shoulders, unary};
22pub use truncate::{
23 Audible, dropped_db, spectral_sum as truncate_spectral_sum,
24 spectral_sum_read as truncate_spectral_sum_read, written as truncate_written,
25 written_with as truncate_written_with,
26};
27
28pub fn eval_spectral_sum_at(
29 sum: &SpectralSum,
30 component: usize,
31 at: At,
32) -> Result<C64, CollapseError> {
33 point::eval_spectral_sum_on(sum, component, at)
34}
35
36pub struct Evaluator(Program);
38
39impl Evaluator {
40 pub fn of(body: &Body, component: usize) -> Evaluator {
41 Evaluator(Program::of(&[body], &[], component))
42 }
43
44 pub fn at(&self, at: At) -> Result<C64, CollapseError> {
45 let mut columns = self.0.columns(1);
46 columns.t[0] = at.t();
47 if let At::Sample(grid, n) = at {
48 columns.grid = grid;
49 columns.on[0] = Some(n);
50 }
51 columns.root(0, (0, 1)).get(0).map_err(Clone::clone)
52 }
53}