diff --git a/examples/functions.rs b/examples/functions.rs index a4b4a7d..7783239 100644 --- a/examples/functions.rs +++ b/examples/functions.rs @@ -9,9 +9,8 @@ fn main() { let (input, output) = rally(items, |item: &_| { std::thread::sleep(Duration::from_millis(item * 100)); - return Some(0); - }) - .unwrap(); + return 0; + }); println!("RALLY RESULTS: {input:?} -> {output:?}"); } diff --git a/src/lib.rs b/src/lib.rs index 293521c..12ee43f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -27,12 +27,10 @@ pub static UNION: Lazy< /// Rally Function /// /// This executes a thread for every item executing `f(&item) -> X`. Whatever function returns first is returned while every other thread is killed. -pub fn rally(items: Vec, f: F) -> Option<(T, X)> +pub fn rally(items: Vec, f: F) -> (T, X) where - F: Fn(&T) -> Option + Send + Sync + Copy + 'static, + F: Fn(&T) -> X + Send + Sync + Copy + 'static, { - let item_len = items.len(); - let (tx, rx) = mpsc::channel(); let items_len = items.len(); let mut handles = Vec::new(); @@ -53,25 +51,16 @@ where drop(tx); - let mut count = 0; + let (fastest_item, fastest_result, elapsed) = rx.recv().unwrap(); - while count < item_len { - let (fastest_item, fastest_result, elapsed) = rx.recv().unwrap(); - count += 1; - - if fastest_result.is_some() { - for handle in handles { - // todo : threads do not get killed here - handle.thread().unpark(); - } - - log::info!("Rally ended with {items_len} items in {elapsed:?}"); - - return Some((fastest_item, fastest_result.unwrap())); - } + for handle in handles { + // todo : threads do not get killed here + handle.thread().unpark(); } - None + log::info!("Rally ended with {items_len} items in {elapsed:?}"); + + (fastest_item, fastest_result) } pub fn retry Option>(f: F) -> O { diff --git a/src/service.rs b/src/service.rs index 309dc51..9cf3f37 100644 --- a/src/service.rs +++ b/src/service.rs @@ -61,6 +61,8 @@ pub struct ServiceManager { pub mode: ServiceMode, } +// TODO : impl decay mode + /// The mode on which services should operate pub enum ServiceMode { /// Behave like a daemon. Services can never die and will come back to life after beeing killed. They will always haunt you.