From 806e0955a1c2e4551c8b765211342d4ac6e728f5 Mon Sep 17 00:00:00 2001 From: Ali Alimohammadi Date: Fri, 16 Jan 2026 15:06:48 -0800 Subject: [PATCH 1/2] feat: add speed conversion module --- DIRECTORY.md | 1 + src/conversions/mod.rs | 2 + src/conversions/speed.rs | 219 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 222 insertions(+) create mode 100644 src/conversions/speed.rs diff --git a/DIRECTORY.md b/DIRECTORY.md index ac27b183e8f..0b52add4891 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -86,6 +86,7 @@ * [RGB-CMYK Conversion](https://github.com/TheAlgorithms/Rust/blob/master/src/conversions/rgb_cmyk_conversion.rs) * [RGB-HSV Conversion](https://github.com/TheAlgorithms/Rust/blob/master/src/conversions/rgb_hsv_conversion.rs) * [Roman Numerals](https://github.com/TheAlgorithms/Rust/blob/master/src/conversions/roman_numerals.rs) + * [Speed](https://github.com/TheAlgorithms/Rust/blob/master/src/conversions/speed.rs) * [Time Units](https://github.com/TheAlgorithms/Rust/blob/master/src/conversions/time_units.rs) * Data Structures * [AVL Tree](https://github.com/TheAlgorithms/Rust/blob/master/src/data_structures/avl_tree.rs) diff --git a/src/conversions/mod.rs b/src/conversions/mod.rs index 6f7b9955f23..1c38f04754e 100644 --- a/src/conversions/mod.rs +++ b/src/conversions/mod.rs @@ -16,6 +16,7 @@ mod order_of_magnitude_conversion; mod rgb_cmyk_conversion; mod rgb_hsv_conversion; mod roman_numerals; +mod speed; mod time_units; pub use self::binary_to_decimal::binary_to_decimal; @@ -38,4 +39,5 @@ pub use self::order_of_magnitude_conversion::{ pub use self::rgb_cmyk_conversion::rgb_to_cmyk; pub use self::rgb_hsv_conversion::{hsv_to_rgb, rgb_to_hsv, ColorError, Hsv, Rgb}; pub use self::roman_numerals::{int_to_roman, roman_to_int}; +pub use self::speed::{convert_speed, SpeedUnit}; pub use self::time_units::convert_time; diff --git a/src/conversions/speed.rs b/src/conversions/speed.rs new file mode 100644 index 00000000000..55e12f52a2d --- /dev/null +++ b/src/conversions/speed.rs @@ -0,0 +1,219 @@ +//! Convert speed units +//! +//! References: +//! - +//! - +//! - +//! - +//! - +//! - +//! - + +use std::fmt; + +/// Supported speed units +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum SpeedUnit { + /// Kilometres per hour (km/h) + KilometresPerHour, + /// Metres per second (m/s) - SI derived unit + MetresPerSecond, + /// Miles per hour (mph) + MilesPerHour, + /// Nautical miles per hour (knot) + Knot, + /// Feet per second (fps or ft/s) + FeetPerSecond, + /// Mach number (dimensionless) - speed divided by speed of sound at sea level (340.3 m/s) + Mach, + /// Speed of light (c) - speed divided by speed of light in vacuum (299,792,458 m/s) + SpeedOfLight, +} + +impl fmt::Display for SpeedUnit { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + SpeedUnit::KilometresPerHour => write!(f, "km/h"), + SpeedUnit::MetresPerSecond => write!(f, "m/s"), + SpeedUnit::MilesPerHour => write!(f, "mph"), + SpeedUnit::Knot => write!(f, "knot"), + SpeedUnit::FeetPerSecond => write!(f, "ft/s"), + SpeedUnit::Mach => write!(f, "Mach"), + SpeedUnit::SpeedOfLight => write!(f, "c"), + } + } +} + +impl SpeedUnit { + /// Get the conversion factor to km/h + fn as_kmh_multiplier(self) -> f64 { + match self { + SpeedUnit::KilometresPerHour => 1.0, + SpeedUnit::MetresPerSecond => 3.6, + SpeedUnit::MilesPerHour => 1.609344, + SpeedUnit::Knot => 1.852, + SpeedUnit::FeetPerSecond => 1.09728, + SpeedUnit::Mach => 1225.08, + SpeedUnit::SpeedOfLight => 1_079_252_848.8, + } + } + + /// Get the conversion factor from km/h to this unit + fn kmh_multiplier(self) -> f64 { + match self { + SpeedUnit::KilometresPerHour => 1.0, + SpeedUnit::MetresPerSecond => 0.277777778, + SpeedUnit::MilesPerHour => 0.621371192, + SpeedUnit::Knot => 0.539956803, + SpeedUnit::FeetPerSecond => 0.911344415, + SpeedUnit::Mach => 0.000816164, + SpeedUnit::SpeedOfLight => 9.265669311e-10, + } + } +} + +/// Convert speed from one unit to another +/// +/// # Arguments +/// +/// * `speed` - The speed value to convert +/// * `from` - The unit to convert from +/// * `to` - The unit to convert to +/// +/// # Returns +/// +/// The converted speed value rounded to 3 decimal places +pub fn convert_speed(speed: f64, from: SpeedUnit, to: SpeedUnit) -> f64 { + let kmh = speed * from.as_kmh_multiplier(); + let result = kmh * to.kmh_multiplier(); + (result * 1000.0).round() / 1000.0 +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_speed_conversion() { + assert_eq!( + convert_speed( + 100.0, + SpeedUnit::KilometresPerHour, + SpeedUnit::MetresPerSecond + ), + 27.778 + ); + assert_eq!( + convert_speed(100.0, SpeedUnit::KilometresPerHour, SpeedUnit::MilesPerHour), + 62.137 + ); + assert_eq!( + convert_speed(100.0, SpeedUnit::KilometresPerHour, SpeedUnit::Knot), + 53.996 + ); + assert_eq!( + convert_speed( + 100.0, + SpeedUnit::MetresPerSecond, + SpeedUnit::KilometresPerHour + ), + 360.0 + ); + assert_eq!( + convert_speed(100.0, SpeedUnit::MetresPerSecond, SpeedUnit::MilesPerHour), + 223.694 + ); + assert_eq!( + convert_speed(100.0, SpeedUnit::MetresPerSecond, SpeedUnit::Knot), + 194.384 + ); + assert_eq!( + convert_speed(100.0, SpeedUnit::MilesPerHour, SpeedUnit::KilometresPerHour), + 160.934 + ); + assert_eq!( + convert_speed(100.0, SpeedUnit::MilesPerHour, SpeedUnit::MetresPerSecond), + 44.704 + ); + assert_eq!( + convert_speed(100.0, SpeedUnit::MilesPerHour, SpeedUnit::Knot), + 86.898 + ); + assert_eq!( + convert_speed(100.0, SpeedUnit::Knot, SpeedUnit::KilometresPerHour), + 185.2 + ); + assert_eq!( + convert_speed(100.0, SpeedUnit::Knot, SpeedUnit::MetresPerSecond), + 51.444 + ); + assert_eq!( + convert_speed(100.0, SpeedUnit::Knot, SpeedUnit::MilesPerHour), + 115.078 + ); + assert_eq!( + convert_speed(100.0, SpeedUnit::FeetPerSecond, SpeedUnit::MetresPerSecond), + 30.48 + ); + assert_eq!( + convert_speed(100.0, SpeedUnit::MetresPerSecond, SpeedUnit::FeetPerSecond), + 328.084 + ); + assert_eq!( + convert_speed( + 100.0, + SpeedUnit::FeetPerSecond, + SpeedUnit::KilometresPerHour + ), + 109.728 + ); + assert_eq!( + convert_speed(100.0, SpeedUnit::FeetPerSecond, SpeedUnit::MilesPerHour), + 68.182 + ); + assert_eq!( + convert_speed(1.0, SpeedUnit::Mach, SpeedUnit::KilometresPerHour), + 1225.08 + ); + assert_eq!( + convert_speed(1.0, SpeedUnit::Mach, SpeedUnit::MetresPerSecond), + 340.3 + ); + assert_eq!( + convert_speed(1000.0, SpeedUnit::KilometresPerHour, SpeedUnit::Mach), + 0.816 + ); + assert_eq!( + convert_speed(2.0, SpeedUnit::Mach, SpeedUnit::KilometresPerHour), + 2450.16 + ); + assert_eq!( + convert_speed(1.0, SpeedUnit::SpeedOfLight, SpeedUnit::MetresPerSecond), + 299792458.24 + ); + assert_eq!( + convert_speed(1.0, SpeedUnit::SpeedOfLight, SpeedUnit::KilometresPerHour), + 1079252848.8 + ); + assert_eq!( + convert_speed( + 299792458.0, + SpeedUnit::MetresPerSecond, + SpeedUnit::SpeedOfLight + ), + 1.0 + ); + assert_eq!( + convert_speed(0.1, SpeedUnit::SpeedOfLight, SpeedUnit::MetresPerSecond), + 29979245.824 + ); + assert_eq!( + convert_speed( + 100.0, + SpeedUnit::KilometresPerHour, + SpeedUnit::KilometresPerHour + ), + 100.0 + ); + } +} From bf90c42bc2df95f7a0fadd450543a006ce8ebdd1 Mon Sep 17 00:00:00 2001 From: Ali Alimohammadi <41567902+AliAlimohammadi@users.noreply.github.com> Date: Fri, 16 Jan 2026 15:30:02 -0800 Subject: [PATCH 2/2] fix: used American spellings throughout --- src/conversions/speed.rs | 81 +++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 35 deletions(-) diff --git a/src/conversions/speed.rs b/src/conversions/speed.rs index 55e12f52a2d..28e34605959 100644 --- a/src/conversions/speed.rs +++ b/src/conversions/speed.rs @@ -14,10 +14,10 @@ use std::fmt; /// Supported speed units #[derive(Debug, Clone, Copy, PartialEq)] pub enum SpeedUnit { - /// Kilometres per hour (km/h) - KilometresPerHour, - /// Metres per second (m/s) - SI derived unit - MetresPerSecond, + /// Kilometers per hour (km/h) + KilometersPerHour, + /// Meters per second (m/s) - SI derived unit + MetersPerSecond, /// Miles per hour (mph) MilesPerHour, /// Nautical miles per hour (knot) @@ -33,8 +33,8 @@ pub enum SpeedUnit { impl fmt::Display for SpeedUnit { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - SpeedUnit::KilometresPerHour => write!(f, "km/h"), - SpeedUnit::MetresPerSecond => write!(f, "m/s"), + SpeedUnit::KilometersPerHour => write!(f, "km/h"), + SpeedUnit::MetersPerSecond => write!(f, "m/s"), SpeedUnit::MilesPerHour => write!(f, "mph"), SpeedUnit::Knot => write!(f, "knot"), SpeedUnit::FeetPerSecond => write!(f, "ft/s"), @@ -48,8 +48,8 @@ impl SpeedUnit { /// Get the conversion factor to km/h fn as_kmh_multiplier(self) -> f64 { match self { - SpeedUnit::KilometresPerHour => 1.0, - SpeedUnit::MetresPerSecond => 3.6, + SpeedUnit::KilometersPerHour => 1.0, + SpeedUnit::MetersPerSecond => 3.6, SpeedUnit::MilesPerHour => 1.609344, SpeedUnit::Knot => 1.852, SpeedUnit::FeetPerSecond => 1.09728, @@ -61,8 +61,8 @@ impl SpeedUnit { /// Get the conversion factor from km/h to this unit fn kmh_multiplier(self) -> f64 { match self { - SpeedUnit::KilometresPerHour => 1.0, - SpeedUnit::MetresPerSecond => 0.277777778, + SpeedUnit::KilometersPerHour => 1.0, + SpeedUnit::MetersPerSecond => 0.277777778, SpeedUnit::MilesPerHour => 0.621371192, SpeedUnit::Knot => 0.539956803, SpeedUnit::FeetPerSecond => 0.911344415, @@ -98,41 +98,41 @@ mod tests { assert_eq!( convert_speed( 100.0, - SpeedUnit::KilometresPerHour, - SpeedUnit::MetresPerSecond + SpeedUnit::KilometersPerHour, + SpeedUnit::MetersPerSecond ), 27.778 ); assert_eq!( - convert_speed(100.0, SpeedUnit::KilometresPerHour, SpeedUnit::MilesPerHour), + convert_speed(100.0, SpeedUnit::KilometersPerHour, SpeedUnit::MilesPerHour), 62.137 ); assert_eq!( - convert_speed(100.0, SpeedUnit::KilometresPerHour, SpeedUnit::Knot), + convert_speed(100.0, SpeedUnit::KilometersPerHour, SpeedUnit::Knot), 53.996 ); assert_eq!( convert_speed( 100.0, - SpeedUnit::MetresPerSecond, - SpeedUnit::KilometresPerHour + SpeedUnit::MetersPerSecond, + SpeedUnit::KilometersPerHour ), 360.0 ); assert_eq!( - convert_speed(100.0, SpeedUnit::MetresPerSecond, SpeedUnit::MilesPerHour), + convert_speed(100.0, SpeedUnit::MetersPerSecond, SpeedUnit::MilesPerHour), 223.694 ); assert_eq!( - convert_speed(100.0, SpeedUnit::MetresPerSecond, SpeedUnit::Knot), + convert_speed(100.0, SpeedUnit::MetersPerSecond, SpeedUnit::Knot), 194.384 ); assert_eq!( - convert_speed(100.0, SpeedUnit::MilesPerHour, SpeedUnit::KilometresPerHour), + convert_speed(100.0, SpeedUnit::MilesPerHour, SpeedUnit::KilometersPerHour), 160.934 ); assert_eq!( - convert_speed(100.0, SpeedUnit::MilesPerHour, SpeedUnit::MetresPerSecond), + convert_speed(100.0, SpeedUnit::MilesPerHour, SpeedUnit::MetersPerSecond), 44.704 ); assert_eq!( @@ -140,11 +140,11 @@ mod tests { 86.898 ); assert_eq!( - convert_speed(100.0, SpeedUnit::Knot, SpeedUnit::KilometresPerHour), + convert_speed(100.0, SpeedUnit::Knot, SpeedUnit::KilometersPerHour), 185.2 ); assert_eq!( - convert_speed(100.0, SpeedUnit::Knot, SpeedUnit::MetresPerSecond), + convert_speed(100.0, SpeedUnit::Knot, SpeedUnit::MetersPerSecond), 51.444 ); assert_eq!( @@ -152,18 +152,18 @@ mod tests { 115.078 ); assert_eq!( - convert_speed(100.0, SpeedUnit::FeetPerSecond, SpeedUnit::MetresPerSecond), + convert_speed(100.0, SpeedUnit::FeetPerSecond, SpeedUnit::MetersPerSecond), 30.48 ); assert_eq!( - convert_speed(100.0, SpeedUnit::MetresPerSecond, SpeedUnit::FeetPerSecond), + convert_speed(100.0, SpeedUnit::MetersPerSecond, SpeedUnit::FeetPerSecond), 328.084 ); assert_eq!( convert_speed( 100.0, SpeedUnit::FeetPerSecond, - SpeedUnit::KilometresPerHour + SpeedUnit::KilometersPerHour ), 109.728 ); @@ -172,48 +172,59 @@ mod tests { 68.182 ); assert_eq!( - convert_speed(1.0, SpeedUnit::Mach, SpeedUnit::KilometresPerHour), + convert_speed(1.0, SpeedUnit::Mach, SpeedUnit::KilometersPerHour), 1225.08 ); assert_eq!( - convert_speed(1.0, SpeedUnit::Mach, SpeedUnit::MetresPerSecond), + convert_speed(1.0, SpeedUnit::Mach, SpeedUnit::MetersPerSecond), 340.3 ); assert_eq!( - convert_speed(1000.0, SpeedUnit::KilometresPerHour, SpeedUnit::Mach), + convert_speed(1000.0, SpeedUnit::KilometersPerHour, SpeedUnit::Mach), 0.816 ); assert_eq!( - convert_speed(2.0, SpeedUnit::Mach, SpeedUnit::KilometresPerHour), + convert_speed(2.0, SpeedUnit::Mach, SpeedUnit::KilometersPerHour), 2450.16 ); assert_eq!( - convert_speed(1.0, SpeedUnit::SpeedOfLight, SpeedUnit::MetresPerSecond), + convert_speed(1.0, SpeedUnit::SpeedOfLight, SpeedUnit::MetersPerSecond), 299792458.24 ); assert_eq!( - convert_speed(1.0, SpeedUnit::SpeedOfLight, SpeedUnit::KilometresPerHour), + convert_speed(1.0, SpeedUnit::SpeedOfLight, SpeedUnit::KilometersPerHour), 1079252848.8 ); assert_eq!( convert_speed( 299792458.0, - SpeedUnit::MetresPerSecond, + SpeedUnit::MetersPerSecond, SpeedUnit::SpeedOfLight ), 1.0 ); assert_eq!( - convert_speed(0.1, SpeedUnit::SpeedOfLight, SpeedUnit::MetresPerSecond), + convert_speed(0.1, SpeedUnit::SpeedOfLight, SpeedUnit::MetersPerSecond), 29979245.824 ); assert_eq!( convert_speed( 100.0, - SpeedUnit::KilometresPerHour, - SpeedUnit::KilometresPerHour + SpeedUnit::KilometersPerHour, + SpeedUnit::KilometersPerHour ), 100.0 ); } + + #[test] + fn test_display() { + assert_eq!(SpeedUnit::KilometersPerHour.to_string(), "km/h"); + assert_eq!(SpeedUnit::MetersPerSecond.to_string(), "m/s"); + assert_eq!(SpeedUnit::MilesPerHour.to_string(), "mph"); + assert_eq!(SpeedUnit::Knot.to_string(), "knot"); + assert_eq!(SpeedUnit::FeetPerSecond.to_string(), "ft/s"); + assert_eq!(SpeedUnit::Mach.to_string(), "Mach"); + assert_eq!(SpeedUnit::SpeedOfLight.to_string(), "c"); + } }