factorion_lib/
lib.rs

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;
10/// The result of a calculation
11pub use calculation_results::Calculation;
12/// The format prepped for calculation
13pub use calculation_tasks::CalculationJob;
14/// Convenient abstraction for comments with commands
15pub use comment::{Commands, Comment};
16/// The version of rug we use (for convenience)
17pub use factorion_math::rug;
18/// The parser
19pub use parse::parse;
20
21static FLOAT_PRECISION: OnceLock<u32> = OnceLock::new();
22/// Recommended values for [`init`]
23pub 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}