mathhook/
lib.rs

1//! MathHook: High-performance educational computer algebra system
2//!
3//! Created by Ahmed Mashhour
4//!
5//! MathHook is a modern symbolic mathematics library written in Rust,
6//! featuring a hybrid API architecture that combines Expression-centric
7//! method chaining with separate solver objects for complex operations.
8//!
9//! # Features
10//!
11//! - **Memory-optimized**: 32-byte Expression enum for maximum cache performance
12//! - **Hybrid API**: Expression methods + separate solver objects
13//! - **Multi-format parsing**: LaTeX, Wolfram Language, standard notation
14//! - **Language bindings**: Python (PyO3) and Node.js (NAPI-RS) support
15//! - **Educational focus**: Step-by-step explanations and teaching tools
16//!
17//! # Quick Start
18//!
19//! ```rust
20//! use mathhook::prelude::*;
21//!
22//! // Expression-centric API (method chaining)
23//! let expr = Expression::add(vec![
24//!     Expression::integer(2),
25//!     Expression::integer(3),
26//! ]).simplify();
27//!
28//! // Solver object API (stateful operations)
29//! let mut solver = MathSolver::new();
30//! let x = symbol!(x);
31//! let equation = Expression::equation(
32//!     Expression::symbol("x"),
33//!     Expression::integer(5),
34//! );
35//! let result = solver.solve(&equation, &x);
36//!
37//! // Parser API (multi-format support)
38//! let parser = Parser::new(&ParserConfig::default());
39//! let parsed = parser.parse("x^2 + 2*x + 1")?;
40//! # Ok::<(), ParseError>(())
41//! ```
42pub use mathhook_core as core;
43pub use mathhook_core::{Expression, MathSolver, Number, SolverResult, Symbol};
44pub use mathhook_core::{MathError, ParseError};
45/// Convenience prelude for common imports
46///
47/// This is the recommended way to use MathHook. Import everything you need with:
48/// ```rust
49/// use mathhook::prelude::*;
50/// ```
51///
52/// # Examples
53///
54/// ```rust
55/// use mathhook::prelude::*;
56///
57/// // Macro-first philosophy
58/// let x = symbol!(x);
59/// let expr = expr!(x ^ 2);  // x squared
60/// let simplified = expr.simplify();
61///
62/// // Solver API
63/// let mut solver = MathSolver::new();
64/// let equation = Expression::equation(Expression::symbol(x.clone()), expr!(5));
65/// let solutions = solver.solve(&equation, &x);
66/// ```
67pub mod prelude {
68    pub use mathhook_core::prelude::*;
69    pub use num_bigint;
70    pub use num_rational;
71}
72#[cfg(test)]
73mod tests {
74    use super::prelude::*;
75    #[test]
76    fn test_hybrid_api_integration() {
77        let expr = Expression::add(vec![Expression::integer(2), Expression::integer(3)]);
78        let simplified = expr.simplify();
79        match simplified {
80            Expression::Number(Number::Integer(5)) => {}
81            _ => panic!("Expected simplified result to be 5"),
82        }
83    }
84    #[test]
85    fn test_solver_integration() {
86        let mut solver = MathSolver::new();
87        let x = symbol!(x);
88        let equation = Expression::equation(Expression::symbol("x"), Expression::integer(42));
89        let result = solver.solve(&equation, &x);
90        match result {
91            SolverResult::Single(_) => {}
92            _ => panic!("Expected single solution"),
93        }
94    }
95    #[test]
96    fn test_parser_integration() {
97        let parser = Parser::new(&ParserConfig::default());
98        let result = parser.parse("42");
99        assert!(result.is_ok());
100    }
101    #[test]
102    fn test_memory_optimization_preserved() {
103        let size = std::mem::size_of::<Expression>();
104        assert!(
105            size <= 32,
106            "Expression size should be ≤ 32 bytes, got {} bytes",
107            size
108        );
109    }
110}