use ferrunitas::{Measure, Unit, system::*};
fn calculate_kinetic_energy(mass: Measure<Gram>, velocity: Measure<MetrePerSecond>) -> Measure<Joule> {
(0.5 * mass * velocity * velocity).as_measure()
}
fn calculate_work<F, L>(force: Measure<F>, distance: Measure<L>) -> Energy
where
F: Unit<Quantity = Force>,
L: Unit<Quantity = Length>,
{
force * distance
}
fn calculate_power_from_work_and_time(
work: Measure<impl Unit<Quantity = Energy>>,
time: Measure<impl Unit<Quantity = Time>>,
) -> Power {
work / time
}
fn calculate_force(
mass: Measure<impl Unit<Quantity = Mass>>,
acceleration: Measure<impl Unit<Quantity = Acceleration>>,
) -> Measure<Newton> {
(mass * acceleration).as_measure()
}
fn calculate_velocity<L>(distance: Measure<L>, time: Time) -> Measure<Knot>
where
L: Unit<Quantity = Length>,
{
(distance / time).as_measure()
}
fn calculate_acceleration(velocity_change: Velocity, time: Time) -> Acceleration {
velocity_change / time
}
fn main() {
println!("=== Ferrunitas Library Demo ===\n");
let mass = Gram::new(4.0);
let velocity = MetrePerSecond::new(6.0);
let ke = calculate_kinetic_energy(mass, velocity);
println!("Kinetic Energy of mass {} with velocity {}: {:.4}", mass, velocity, ke);
let force = Newton::new(12.0);
let distance = Metre::new(3.5);
let work = calculate_work(force, distance);
println!(
"Work done by force {} over distance {}: {:.2}",
force,
distance,
work.as_measure::<Joule>()
);
let work = Joule::new(150.0);
let time = Second::new(10.0);
let power = calculate_power_from_work_and_time(work, time);
println!("Power of work {} over time {}: {:.2}", work, time, power.as_measure::<Watt>());
let mass = Gram::new(8.0);
let acceleration = MetrePerSecondSquared::new(2.5);
let force = calculate_force(mass, acceleration);
println!("Force of mass {} with acceleration {}: {:.3}", mass, acceleration, force);
let distance = Metre::new(200.0);
let time = Second::new(25.0);
let knots = calculate_velocity(distance, time.into_q());
println!("Velocity of distance {} over time {}: {:.3}", distance, time, knots);
let velocity_start = MetrePerSecond::new(0.0);
let velocity_end = MetrePerSecond::new(30.0);
let time = Second::new(6.0);
let acceleration = calculate_acceleration((velocity_end - velocity_start).into_q(), time.into_q());
println!(
"Acceleration from {} to {} over time {}: {:.2}",
velocity_start,
velocity_end,
time,
acceleration.as_measure::<MetrePerSecondSquared>()
);
}