From 959a7c0dcff2836b3587c822b18073c823a67d4d Mon Sep 17 00:00:00 2001 From: Michal Pokrywka Date: Thu, 30 Oct 2025 13:59:40 +0100 Subject: [PATCH] Public lookup tables --- src/lib.rs | 3 + src/lookup_funcs.rs | 47 ++++++++++ src/lookup_tables.rs | 198 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 248 insertions(+) create mode 100644 src/lookup_funcs.rs diff --git a/src/lib.rs b/src/lib.rs index ac42a47..dd65630 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,6 +9,9 @@ pub use distance::RaceDistance; mod lookup_tables; +mod lookup_funcs; +pub use lookup_funcs::*; + mod odds; pub use odds::*; diff --git a/src/lookup_funcs.rs b/src/lookup_funcs.rs new file mode 100644 index 0000000..c4ce00d --- /dev/null +++ b/src/lookup_funcs.rs @@ -0,0 +1,47 @@ +use rust_decimal::Decimal; + +use crate::{ + ConversionConfig, LookupVariant, + lookup_tables::{ + get_american_to_fraction_extended_map, get_american_to_fraction_map, + get_decimal_to_fraction_extended_map, get_decimal_to_fraction_map, + }, +}; + +/// Manually Lookup decimal to fractional table using provided config +pub fn lookup_decimal_to_fraction_with_config( + odds: Decimal, + config: ConversionConfig, +) -> Option<(u32, u32)> { + let frac = get_decimal_to_fraction_map().get(&odds); + + if frac.is_none() && config.lookup_tables_variant == LookupVariant::Extended { + return get_decimal_to_fraction_extended_map().get(&odds).copied(); + } + + frac.copied() +} + +/// Manually Lookup decimal to fractional table using default config (no extended tables used) +pub fn lookup_decimal_to_fraction(odds: Decimal) -> Option<(u32, u32)> { + lookup_decimal_to_fraction_with_config(odds, ConversionConfig::default()) +} + +/// Manually Lookup american to fractional table using provided config +pub fn lookup_american_to_fraction_with_config( + odds: i32, + config: ConversionConfig, +) -> Option<(u32, u32)> { + let frac = get_american_to_fraction_map().get(&odds); + + if frac.is_none() && config.lookup_tables_variant == LookupVariant::Extended { + return get_american_to_fraction_extended_map().get(&odds).copied(); + } + + frac.copied() +} + +/// Manually Lookup american to fractional table using default config (no extended tables used) +pub fn lookup_american_to_fraction(odds: i32) -> Option<(u32, u32)> { + lookup_american_to_fraction_with_config(odds, ConversionConfig::default()) +} diff --git a/src/lookup_tables.rs b/src/lookup_tables.rs index b52a4e3..36880d9 100644 --- a/src/lookup_tables.rs +++ b/src/lookup_tables.rs @@ -92,17 +92,27 @@ static DECIMAL_TO_FRACTION_EXTENDED: OnceLock> = On pub fn get_decimal_to_fraction_extended_map() -> &'static HashMap { DECIMAL_TO_FRACTION_EXTENDED.get_or_init(|| { let mut m = HashMap::new(); + m.insert(dec!(1.0010), (1, 1000)); m.insert(dec!(1.0013), (1, 750)); + m.insert(dec!(1.0020), (1, 500)); + m.insert(dec!(1.0025), (1, 400)); m.insert(dec!(1.0030), (1, 300)); + m.insert(dec!(1.0040), (1, 250)); + m.insert(dec!(1.0050), (1, 200)); m.insert(dec!(1.0070), (1, 150)); m.insert(dec!(1.0120), (1, 80)); m.insert(dec!(1.0150), (1, 66)); + m.insert(dec!(1.0200), (1, 50)); + m.insert(dec!(1.0250), (1, 40)); m.insert(dec!(1.0300), (1, 33)); + m.insert(dec!(1.0400), (1, 25)); + m.insert(dec!(1.0500), (1, 20)); m.insert(dec!(1.0550), (1, 18)); m.insert(dec!(1.0600), (1, 16)); m.insert(dec!(1.0700), (1, 14)); m.insert(dec!(1.0800), (1, 12)); m.insert(dec!(1.0900), (1, 11)); + m.insert(dec!(1.1000), (1, 10)); m.insert(dec!(1.1100), (1, 9)); m.insert(dec!(1.1200), (1, 8)); m.insert(dec!(1.1300), (2, 15)); @@ -110,18 +120,206 @@ pub fn get_decimal_to_fraction_extended_map() -> &'static HashMap