Advertisement
Guest User

Untitled

a guest
Aug 21st, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.69 KB | None | 0 0
  1. #![feature(try_trait)]
  2. use ::core::ops::Try;
  3.  
  4. impl<TryItem, R> iter::FromIterator<TryItem> for R
  5. where
  6. TryItem : Try,
  7. R : Try<Error = <TryItem as Try>::Error>,
  8. <R as Try>::Ok : ::core::iter::FromIterator<<TryItem as Try>::Ok>,
  9. {
  10. fn from_iter<Iterable> (iterable: Iterable) -> Self
  11. where
  12. Iterable : IntoIterator<Item = TryItem>,
  13. {
  14. let mut encountered_error = None;
  15. let collection =
  16. iterable
  17. .into_iter()
  18. .filter_map(|try_item| match try_item.into_result() {
  19. | Ok(item) => Some(item),
  20. | Err(error) => {
  21. encountered_error = Some(error);
  22. None
  23. },
  24. })
  25. .collect()
  26. ;
  27. if let Some(error) = encountered_error {
  28. R::from_error(error)
  29. } else {
  30. R::from_ok(collection)
  31. }
  32. }
  33. }
  34.  
  35. #[derive(Debug)]
  36. enum MyOption<T> {
  37. MyNone,
  38. MySome(T),
  39. }
  40. use self::MyOption::*;
  41.  
  42. impl<T> Try for MyOption<T> {
  43. type Ok = T;
  44. type Error = ();
  45.  
  46. fn into_result (self) -> Result<T, ()>
  47. {
  48. if let MySome(inner) = self {
  49. Ok(inner)
  50. } else {
  51. Err(())
  52. }
  53. }
  54.  
  55. fn from_ok (inner: T) -> Self
  56. {
  57. MySome(inner)
  58. }
  59.  
  60. fn from_error ((): ()) -> Self
  61. {
  62. MyNone
  63. }
  64. }
  65.  
  66. fn main ()
  67. {
  68. use iter::FromIterator;
  69.  
  70. let elems = vec![MySome(42), MyNone];
  71.  
  72. dbg!(
  73. <MyOption<Vec<i32>>>::from_iter(elems)
  74. );
  75. }
  76.  
  77. mod iter {
  78. pub
  79. trait FromIterator<A> {
  80. fn from_iter<T> (iter: T) -> Self
  81. where
  82. T : IntoIterator<Item = A>,
  83. ;
  84. }
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement