sequential-integration 0.0.2

Lightweight library for sequential integration
Documentation
use fehler::throws;

use crate::{
    engine::{
        helper_equation_traits::EquationOfOneVariable,
        quadrature::{FinalizeCalculation, GetQuadratureRange},
        CalculationResult,
    },
    errors::Error,
};

pub struct FirstIntegrator;

impl FirstIntegrator {
    #[throws]
    pub fn integrate<E: EquationOfOneVariable, G: GetQuadratureRange + FinalizeCalculation>(
        a: f64,
        b: f64,
        h: f64,
        equation: E,
        quadrature: G,
    ) -> f64 {
        let mut result = CalculationResult::new();
        let mut range = if let Some(range) = G::get_range_generator(a, b, h)? {
            range
        } else {
            return result.common;
        };

        loop {
            let step = range.next()?;
            result += equation.calculate(step, (a, b))?;

            if step.is_last() {
                break;
            }
        }

        quadrature.finalize(result)?
    }
}