1#![doc = include_str!("../README.md")]
2use std::sync::{Mutex, OnceLock};
3
4use factorion_math as math;
5use rug::Integer;
6pub mod calculation_results;
7pub mod calculation_tasks;
8pub mod comment;
9pub mod parse;
10pub use calculation_results::Calculation;
12pub use calculation_tasks::CalculationJob;
14pub use comment::{Commands, Comment};
16pub use factorion_math::rug;
18pub use parse::parse;
20
21static FLOAT_PRECISION: OnceLock<u32> = OnceLock::new();
22pub mod recommended {
24 pub use super::math::recommended::FLOAT_PRECISION;
25 pub use crate::calculation_results::recommended::*;
26 pub use crate::calculation_tasks::recommended::*;
27 pub use crate::parse::recommended::*;
28}
29
30static INITIALIZING: Mutex<()> = Mutex::new(());
31#[derive(Debug, Clone, Copy)]
32pub struct AlreadyInit;
33#[allow(clippy::too_many_arguments)]
34pub fn init(
35 float_precision: u32,
36 upper_calculation_limit: Integer,
37 upper_approximation_limit: Integer,
38 upper_subfactorial_limit: Integer,
39 upper_termial_limit: Integer,
40 upper_termial_approximation_limit: u32,
41 integer_construction_limit: Integer,
42 number_decimals_scientific: usize,
43) -> Result<(), AlreadyInit> {
44 let _guard = INITIALIZING.lock().unwrap();
45 FLOAT_PRECISION
46 .set(float_precision)
47 .map_err(|_| AlreadyInit)?;
48 parse::init(integer_construction_limit)?;
49 calculation_tasks::init(
50 upper_calculation_limit,
51 upper_approximation_limit,
52 upper_subfactorial_limit,
53 upper_termial_limit,
54 upper_termial_approximation_limit,
55 )?;
56 calculation_results::init(number_decimals_scientific)?;
57 Ok(())
58}
59pub fn init_default() -> Result<(), AlreadyInit> {
60 let _guard = INITIALIZING.lock().unwrap();
61 FLOAT_PRECISION
62 .set(recommended::FLOAT_PRECISION)
63 .map_err(|_| AlreadyInit)?;
64 parse::init_default()?;
65 calculation_tasks::init_default()?;
66 calculation_results::init_default()?;
67 Ok(())
68}