use positive::prelude::*;
fn main() {
println!("=== Basic Positive Usage ===\n");
println!("--- Creating Positive Values ---");
let price = pos!(100.50).expect("Valid positive value");
println!("Price (pos! macro): {price}");
let quantity = pos_or_panic!(10.0);
println!("Quantity (pos_or_panic!): {quantity}");
let maybe_value = spos!(25.0);
println!("Optional value (spos!): {maybe_value:?}");
let rate = Positive::new(0.05).expect("Valid rate");
println!("Rate (constructor): {rate}");
println!("\n--- Arithmetic Operations ---");
let a = pos_or_panic!(20.0);
let b = pos_or_panic!(5.0);
println!("a = {a}, b = {b}");
println!("a + b = {}", a + b);
println!("a - b = {}", a - b);
println!("a * b = {}", a * b);
println!("a / b = {}", a / b);
println!("\n--- Safe Operations ---");
let result = a.checked_sub(&b);
println!("a.checked_sub(&b) = {result:?}");
#[cfg(not(feature = "non-zero"))]
{
let saturating = b.saturating_sub(&a);
println!("b.saturating_sub(&a) = {saturating} (saturates to ZERO)");
}
println!("\n--- Mathematical Functions ---");
let value = pos_or_panic!(16.0);
println!("value = {value}");
println!("sqrt({value}) = {}", value.sqrt());
println!("ln({value}) = {}", value.ln());
println!("log10({value}) = {}", value.log10());
println!("exp(1) = {}", Positive::ONE.exp());
println!("pow({value}, 2) = {}", value.powi(2));
println!("\n--- Rounding Operations ---");
let decimal_value = pos_or_panic!(123.456789);
println!("value = {decimal_value}");
println!("floor() = {}", decimal_value.floor());
println!("ceiling() = {}", decimal_value.ceiling());
println!("round() = {}", decimal_value.round());
println!("round_to(2) = {}", decimal_value.round_to(2));
println!("\n--- Conversions ---");
let p = pos_or_panic!(42.5);
println!("Positive value: {p}");
println!("to_f64(): {}", p.to_f64());
println!("to_i64(): {}", p.to_i64());
println!("to_dec(): {}", p.to_dec());
println!("\n--- Comparisons ---");
let x = pos_or_panic!(10.0);
let y = pos_or_panic!(20.0);
println!("x = {x}, y = {y}");
println!("x < y: {}", x < y);
println!("x.max(y) = {}", x.max(y));
println!("x.min(y) = {}", x.min(y));
let value = pos_or_panic!(150.0);
let clamped = value.clamp(pos_or_panic!(1.0), pos_or_panic!(100.0));
println!("clamp({value}, 0, 100) = {clamped}");
println!("\n=== Example Complete ===");
}