integrate 0.2.0

Small, lightweight Rust library for performing numerical integration.
Documentation
mod problems;

const N: usize = 20;

use std::iter::Sum;

use integrate::romberg::romberg_method;
use num::Float;
use problems::{
    problem01, problem02, problem03, problem04, problem05, problem06, problem07, problem08,
    problem09, problem10, problem11, problem12, problem13, problem14, problem15, problem16,
    problem17, problem18, problem19, problem20, problem21, problem22, problem23, problem24,
    problem25, problem26, problem27, problem28, problem29, problem30, Problem,
};

pub fn romberg_problems<F: Float + Send + Sum + Sync>() -> Vec<Problem<F>> {
    vec![
        problem01(),
        problem02(),
        problem03(),
        problem04(),
        problem05(),
        problem06(),
        problem07(),
        problem08(),
        problem09(),
        problem10(),
        problem11(),
        problem12(),
        problem13(),
        problem14(),
        problem15(),
        problem16(),
        problem17(),
        problem18(),
        problem19(),
        problem20(),
        problem21(),
        problem22(),
        problem23(),
        problem24(),
        problem25(),
        problem26(),
        problem27(),
        problem28(),
        problem29(),
        problem30(),
    ]
}

fn test_problem_f64(problem: Problem<f64>) {
    let f = problem.function;
    let (a, b) = problem.limits;
    let n: usize = N;

    let result = romberg_method(f, a, b, n);

    let test_passed = problem.check_result(result);
    let test_result = if test_passed { "passed" } else { "failed" };

    println!(
        "Method:Romberg -- Problem number:{} -- test:{}",
        problem.id, test_result
    );

    assert!(problem.check_result(result));
}

fn test_problem_f32(problem: Problem<f32>) {
    let f = problem.function;
    let (a, b) = problem.limits;
    let n: usize = N;

    let result = romberg_method(f, a, b, n) as f32;

    let test_passed = problem.check_result(result);
    let test_result = if test_passed { "passed" } else { "failed" };

    println!(
        "Method:Romberg -- Problem number:{} -- test:{}",
        problem.id, test_result
    );

    assert!(problem.check_result(result));
}

#[test]
fn test_f32_problems() {
    let problems: Vec<Problem<f32>> = romberg_problems();

    for problem in problems.into_iter() {
        test_problem_f32(problem);
    }
}

#[test]
fn test_f64_problems() {
    let problems: Vec<Problem<f64>> = romberg_problems();

    for problem in problems.into_iter() {
        test_problem_f64(problem);
    }
}