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}