Advertisement
Guest User

Untitled

a guest
Aug 21st, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.75 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 iterator = iterable.into_iter();
  15. let mut vec = Vec::with_capacity(match iterator.size_hint() {
  16. | (_, Some(upper)) => upper,
  17. | (lower, _) => lower,
  18. });
  19. loop {
  20. match iterator.next().map(Try::into_result) {
  21. | Some(Ok(item)) => vec.push(item),
  22. | Some(Err(error)) => return R::from_error(error),
  23. | None => return R::from_ok(vec.into_iter().collect()),
  24. }
  25. }
  26. }
  27. }
  28.  
  29. #[derive(Debug, Clone, Copy)]
  30. enum MyOption<T> {
  31. MyNone,
  32. MySome(T),
  33. }
  34. use self::MyOption::*;
  35.  
  36. impl<T> Try for MyOption<T> {
  37. type Ok = T;
  38. type Error = ();
  39.  
  40. fn into_result (self) -> Result<T, ()>
  41. {
  42. if let MySome(inner) = self {
  43. Ok(inner)
  44. } else {
  45. Err(())
  46. }
  47. }
  48.  
  49. fn from_ok (inner: T) -> Self
  50. {
  51. MySome(inner)
  52. }
  53.  
  54. fn from_error ((): ()) -> Self
  55. {
  56. MyNone
  57. }
  58. }
  59.  
  60. fn main ()
  61. {
  62. use iter::FromIterator;
  63.  
  64. let elems =
  65. [MySome(42), MyNone, MySome(27)]
  66. .iter()
  67. .map(|&x| {
  68. eprintln!("> {:?}", x);
  69. x
  70. })
  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