Skip to main content

sva_samples/
collapse.rs

1// Concern: the collapse surface: a form's rows and its value at an instant | Non-concern: its spectral sum (sva-formula), measuring samples (measure/) | IO: (&ClosedForm, grid) -> Rows
2
3mod 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
36/// One component of a written form, evaluated at any instant; a node it reads refuses.
37pub 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}