[READ-ONLY] Mirror of https://github.com/probablykasper/cpc. Text calculator with support for units and conversion cpc.kasper.space
calculator cli conversion converter library math package units units-converter wasm website
0

Configure Feed

Select the types of activity you want to include in your feed.

Make primitive units fully sorted

Kasper (Jun 24, 2026, 11:43 AM +0200) fff4fef5 27c219ab

+28 -17
+1 -6
src/lib.rs
··· 97 97 fn get_unit_string(&self, plural: bool) -> String { 98 98 let mut s = String::new(); 99 99 let mut units = self.unit.clone(); 100 - units.sort_by_key(|u| { 101 - ( 102 - u.1 < 0, // multiplications first 103 - Reverse(u.1.abs()), // largest first, like "sqm seconds" 104 - ) 105 - }); 100 + sort_units(&mut units); 106 101 let mut positives = units.iter().filter(|u| u.1 > 0).peekable(); 107 102 while let Some(unit) = positives.next() { 108 103 if unit.1 <= 0 {
+27 -11
src/units.rs
··· 1 1 use crate::Number; 2 2 use fastnum::{D128, dec128 as d}; 3 + use std::cmp::Reverse; 3 4 4 5 #[derive(Clone, Copy, PartialEq, Debug)] 5 6 /// An enum of all possible unit types, like [`Length`], [`DigitalStorage`] etc. ··· 43 44 } 44 45 impl UnitType { 45 46 fn primitive(&self) -> Vec<(Unit, isize)> { 46 - match self { 47 + let units = match self { 47 48 Time => vec![(Second, 1)], 48 49 Length => vec![(Meter, 1)], 49 50 Area => vec![(Meter, 2)], ··· 53 54 DataTransferRate => vec![(Bit, 1), (Second, -1)], 54 55 FlopCount => vec![(Flop, 1)], 55 56 FlopRate => vec![(Flop, 1), (Second, -1)], 56 - Energy => vec![(Kilogram, 1), (Meter, 2), (Second, -2)], 57 - Power => vec![(Kilogram, 1), (Meter, 2), (Second, -3)], 57 + Energy => vec![(Meter, 2), (Kilogram, 1), (Second, -2)], 58 + Power => vec![(Meter, 2), (Kilogram, 1), (Second, -3)], 58 59 ElectricCurrent => vec![(Ampere, 1)], 59 - Resistance => vec![(Kilogram, 1), (Meter, 2), (Second, -3), (Ampere, -2)], 60 - Voltage => vec![(Kilogram, 1), (Meter, 2), (Second, -3), (Ampere, -1)], 61 - Pressure => vec![(Kilogram, 1), (Meter, -1), (Second, -2)], 60 + Resistance => vec![(Meter, 2), (Kilogram, 1), (Second, -3), (Ampere, -2)], 61 + Voltage => vec![(Meter, 2), (Kilogram, 1), (Second, -3), (Ampere, -1)], 62 + Pressure => vec![(Kilogram, 1), (Second, -2), (Meter, -1)], 62 63 Frequency => vec![(Second, -1)], 63 64 Speed => vec![(Meter, 1), (Second, -1)], 64 65 Temperature => vec![(Kelvin, 1)], 66 + }; 67 + #[cfg(debug_assertions)] 68 + { 69 + let u0 = units.clone(); 70 + let mut u1 = units.clone(); 71 + sort_units(&mut u1); 72 + assert!(u0 == u1) 65 73 } 74 + units 66 75 } 67 76 } 68 77 use UnitType::*; 69 78 79 + /// Sort for display and comparison purposes. 80 + pub fn sort_units(primitives: &mut Vec<(Unit, isize)>) { 81 + primitives.sort_by_key(|u| { 82 + ( 83 + u.1 < 0, // multiplications first 84 + Reverse(u.1.abs()), // largest first, like "sqm seconds" 85 + u.0, // then sort by unit, to have a fully deterministic order 86 + ) 87 + }); 88 + } 89 + 70 90 pub fn primitive_unit(unit: &Vec<(Unit, isize)>) -> Vec<(Unit, isize)> { 71 91 let mut primitives: Vec<(Unit, isize)> = Vec::new(); 72 92 for (unit, exponent) in unit { ··· 79 99 } 80 100 } 81 101 primitives.retain(|(_, exponent)| exponent != &0); 102 + sort_units(&mut primitives); 82 103 primitives 83 104 } 84 105 ··· 652 673 } 653 674 // todo: 8 megabytes per second * 1 minute 654 675 // todo: 8 megaFLOP per second * 1 minute 655 - // todo: 1 amp * 1 ohm = 1 volt 656 676 657 677 // } else if lcat == DataTransferRate && rcat == Time { 658 678 // // 8 megabytes per second * 1 minute ··· 719 739 // }; 720 740 // let compute_work = Number::new(result, Flop); 721 741 // Ok(convert(compute_work, final_unit)?) 722 - // } else if lcat == ElectricCurrent && rcat == Resistance { 723 - // // 1 amp * 1 ohm = 1 volt 724 - // let result = (left.value * left.unit.weight()) * (right.value * right.unit.weight()); 725 - // Ok(to_ideal_unit(Number::new(result, Watt))) 726 742 // } 727 743 } 728 744