Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.39 KB | None | 0 0
  1. use futures::{prelude::*, future, stream};
  2. use tokio::timer::Delay;
  3. use std::time::{Duration, Instant};
  4. use std::sync::{Mutex, Arc};
  5.  
  6. extern crate either;
  7. use either::*;
  8.  
  9. #[derive(Debug)]
  10. enum Error {
  11. UploadFailed (u32),
  12. Timeout,
  13. }
  14.  
  15. fn upload(val: u32) -> impl Future<Item = u32, Error = Error> {
  16. println!("uploading {}", val);
  17.  
  18. // simulating 100ms upload time
  19. Delay::new(Instant::now() + Duration::from_millis(100))
  20. .map_err(drop)
  21. .then(move |_| {
  22. if val == 20 {
  23. future::err::<u32, Error>(Error::UploadFailed (val))
  24. } else {
  25. future::ok::<u32, Error>(val)
  26. }
  27. })
  28. }
  29.  
  30. fn do_stuffs(vals: impl Iterator<Item = u32>) -> impl Future<Item = (), Error = Error> {
  31. stream::iter_ok(vals)
  32. .and_then(upload)
  33. .for_each(|val| {
  34. println!("Done uploading {}", val);
  35. Ok(())
  36. })
  37. }
  38.  
  39. fn main() {
  40. let uploads = do_stuffs(0..42);
  41.  
  42. let timeout = Delay::new(Instant::now() + Duration::from_secs(3))
  43. .then(|_| {
  44. println!("Timeout reached!");
  45. future::err::<(), Error>(Error::Timeout)
  46. });
  47.  
  48. let work = uploads.select(timeout)
  49. .map(|x| x.0)
  50. .map_err(|x| x.0);
  51.  
  52.  
  53. let mut runtime = tokio::runtime::Runtime::new().unwrap();
  54. let result = runtime.block_on(work);
  55. println!("Result: {:?}", result);
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement