diff --git a/flake.lock b/flake.lock index 8f6b10e..de0f8d5 100644 --- a/flake.lock +++ b/flake.lock @@ -20,18 +20,15 @@ }, "nixpkgs": { "locked": { - "lastModified": 1780749050, - "narHash": "sha256-3av0pIjlOWQ6rDbNOmpUSvbNnJkGORQKKjb4LtCZsIY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a799d3e3886da994fa307f817a6bc705ae538eeb", - "type": "github" + "lastModified": 1791260994, + "narHash": "sha256-MFBjw66d4h06MvpW6lIl7RwarLteD0sk859CncGwb1Q=", + "rev": "151fa4e8ddfdd8dd25d945ad94ed54a13de9f6e4", + "type": "tarball", + "url": "https://releases.nixos.org/nixos/unstable/nixos-26.11pre1086391.151fa4e8ddfd/nixexprs.tar.zst?lastModified=1791260994&rev=151fa4e8ddfdd8dd25d945ad94ed54a13de9f6e4" }, "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" + "type": "tarball", + "url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.zst" } }, "root": { diff --git a/flake.nix b/flake.nix index f7862ee..26109ec 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + nixpkgs.url = "https://channels.nixos.org/nixos-unstable/nixexprs.tar.zst"; flake-utils.url = "github:numtide/flake-utils"; }; diff --git a/src/formatting.rs b/src/formatting.rs index eb097c0..7c207f5 100644 --- a/src/formatting.rs +++ b/src/formatting.rs @@ -2,19 +2,20 @@ use rug::Float; use crate::nodes::{self, Error}; -pub fn pretty_eval(mut input: String, max_digits: usize) -> Result { - // no need to remove the characters here, - // as we ignore the them in all other logic already - let should_add_back_alignment = input.contains('&'); - let should_add_back_backslash = input.contains('\\'); - let leading_spaces = input.chars().take_while(|c| *c == ' ').count(); +pub fn pretty_eval(input: &str, max_digits: usize) -> Result { + let (prefix, deliminator, input) = input + .rsplit_once('=') + .map(|(p, i)| (p, "= ", i)) + .unwrap_or_else(|| { + input + .rsplit_once('&') + .map(|(p, i)| (p, "& ", i)) + .unwrap_or(("", "", input)) + }); - let should_add_back_equals = input - .find('=') - .inspect(|i| { - input.remove(*i); - }) - .is_some(); + // no need to remove the character here, + // as we ignore it in all other logic already + let should_add_back_backslash = input.contains('\\'); let result = nodes::eval(&input)?; let display_digits = @@ -32,38 +33,11 @@ pub fn pretty_eval(mut input: String, max_digits: usize) -> Result usize { let raw_string = n.to_string().replace('.', ""); @@ -99,23 +73,45 @@ pub fn get_significant_digits(n: &Float) -> usize { } #[cfg(test)] -fn eval(s: &str) -> Float { - crate::nodes::eval(s).unwrap() -} +mod tests { + use super::*; + fn eval(s: &str) -> Float { + crate::nodes::eval(s).unwrap() + } -#[test] -fn test_get_significant_digits() { - let many_zeros = eval("14.00643 + 1.00784 * 4 + 35.446 + 15.9994 * 4"); - assert_eq!(many_zeros.to_f64(), 117.48139); - let many_nines = eval("12.0096 + 15.9994 * 2"); - assert_eq!(many_nines.to_f64(), 44.0084); - let zero_nine_zero = eval("2+12321(5+123)"); - assert_eq!(zero_nine_zero.to_f64(), 1577090.0); - let test_4 = eval("12.0096 + 1.00784 * 3 + 12.0096 + 1.00784 * 2 + 15.9994 + 1.00784"); - assert_eq!(test_4.to_f64(), 46.06564); + #[test] + fn character_readdition() { + assert_eq!(pretty_eval(" = 11", 10).unwrap(), " = 11"); + assert_eq!(pretty_eval(" &= 11", 10).unwrap(), " &= 11"); + assert_eq!(pretty_eval(" & 11", 10).unwrap(), " & 11"); + assert_eq!(pretty_eval(" & 11 \\", 10).unwrap(), " & 11 \\"); + } - assert_eq!(get_significant_digits(&many_zeros), 8); - assert_eq!(get_significant_digits(&many_nines), 6); - assert_eq!(get_significant_digits(&zero_nine_zero), 6); - assert_eq!(get_significant_digits(&test_4), 7); + #[test] + fn basic_output_up_to_999() { + assert_eq!(pretty_eval("1", 10).unwrap(), "1"); + assert_eq!(pretty_eval("10", 10).unwrap(), "10"); + assert_eq!(pretty_eval("100", 10).unwrap(), "100"); + assert_eq!(pretty_eval("999", 10).unwrap(), "999"); + assert_eq!(pretty_eval("1000", 10).unwrap(), "1 * 10^3"); + + assert_eq!(pretty_eval("11.111111", 10).unwrap(), "11.111111"); + } + + #[test] + fn basic_get_significant_digits() { + let many_zeros = eval("14.00643 + 1.00784 * 4 + 35.446 + 15.9994 * 4"); + assert_eq!(many_zeros.to_f64(), 117.48139); + let many_nines = eval("12.0096 + 15.9994 * 2"); + assert_eq!(many_nines.to_f64(), 44.0084); + let zero_nine_zero = eval("2+12321(5+123)"); + assert_eq!(zero_nine_zero.to_f64(), 1577090.0); + let test_4 = eval("12.0096 + 1.00784 * 3 + 12.0096 + 1.00784 * 2 + 15.9994 + 1.00784"); + assert_eq!(test_4.to_f64(), 46.06564); + + assert_eq!(get_significant_digits(&many_zeros), 8); + assert_eq!(get_significant_digits(&many_nines), 6); + assert_eq!(get_significant_digits(&zero_nine_zero), 6); + assert_eq!(get_significant_digits(&test_4), 7); + } } diff --git a/src/main.rs b/src/main.rs index c3349d2..c9634da 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,7 +17,7 @@ fn main() -> ExitCode { buf }); - match lib::formatting::pretty_eval(input, 10) { + match lib::formatting::pretty_eval(&input, 10) { Ok(s) => println!("{s}"), Err(e) => {