From c10eec3a1ca0a328f406f6b752eb0fd3a90dca91 Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Wed, 14 Apr 2021 16:40:23 -0700 Subject: [PATCH] Bootstrapping preparation for the library Since just `ops::Try` will need to change meaning. --- .../alloc/src/collections/vec_deque/iter.rs | 6 +++--- library/alloc/src/lib.rs | 1 + library/core/src/iter/adapters/chain.rs | 6 +++--- library/core/src/iter/adapters/cloned.rs | 6 +++--- library/core/src/iter/adapters/copied.rs | 6 +++--- library/core/src/iter/adapters/cycle.rs | 4 ++-- library/core/src/iter/adapters/enumerate.rs | 6 +++--- library/core/src/iter/adapters/filter.rs | 8 ++++---- library/core/src/iter/adapters/filter_map.rs | 8 ++++---- library/core/src/iter/adapters/flatten.rs | 18 +++++++++--------- library/core/src/iter/adapters/fuse.rs | 18 +++++++++--------- library/core/src/iter/adapters/inspect.rs | 6 +++--- library/core/src/iter/adapters/map.rs | 6 +++--- library/core/src/iter/adapters/map_while.rs | 4 ++-- library/core/src/iter/adapters/mod.rs | 4 ++-- library/core/src/iter/adapters/peekable.rs | 8 ++++---- library/core/src/iter/adapters/rev.rs | 6 +++--- library/core/src/iter/adapters/scan.rs | 6 +++--- library/core/src/iter/adapters/skip.rs | 8 ++++---- library/core/src/iter/adapters/skip_while.rs | 4 ++-- library/core/src/iter/adapters/step_by.rs | 6 +++--- library/core/src/iter/adapters/take.rs | 8 ++++---- library/core/src/iter/adapters/take_while.rs | 6 +++--- library/core/src/iter/range.rs | 6 +++--- library/core/src/iter/traits/double_ended.rs | 4 ++-- library/core/src/iter/traits/iterator.rs | 10 +++++----- library/core/src/ops/control_flow.rs | 13 ++++++------- library/core/src/ops/mod.rs | 19 +++++++++++++++++++ library/core/src/option.rs | 2 +- library/core/src/result.rs | 2 +- library/core/src/slice/ascii.rs | 2 +- library/core/src/str/iter.rs | 4 ++-- library/core/src/task/poll.rs | 6 +++--- 33 files changed, 123 insertions(+), 104 deletions(-) diff --git a/library/alloc/src/collections/vec_deque/iter.rs b/library/alloc/src/collections/vec_deque/iter.rs index e4cfb3acdfd..793adfb0c0f 100644 --- a/library/alloc/src/collections/vec_deque/iter.rs +++ b/library/alloc/src/collections/vec_deque/iter.rs @@ -1,6 +1,6 @@ use core::fmt; use core::iter::{FusedIterator, TrustedLen, TrustedRandomAccess}; -use core::ops::Try; +use core::ops::TryWhereOutputEquals; use super::{count, wrap_index, RingSlices}; @@ -66,7 +66,7 @@ fn try_fold(&mut self, init: B, mut f: F) -> R where Self: Sized, F: FnMut(B, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { let (mut iter, final_res); if self.tail <= self.head { @@ -140,7 +140,7 @@ fn try_rfold(&mut self, init: B, mut f: F) -> R where Self: Sized, F: FnMut(B, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { let (mut iter, final_res); if self.tail <= self.head { diff --git a/library/alloc/src/lib.rs b/library/alloc/src/lib.rs index 66b1036f2ab..af973c29bde 100644 --- a/library/alloc/src/lib.rs +++ b/library/alloc/src/lib.rs @@ -141,6 +141,7 @@ #![feature(alloc_layout_extra)] #![feature(trusted_random_access)] #![feature(try_trait)] +#![feature(try_trait_transition)] #![feature(min_type_alias_impl_trait)] #![feature(associated_type_bounds)] #![feature(slice_group_by)] diff --git a/library/core/src/iter/adapters/chain.rs b/library/core/src/iter/adapters/chain.rs index ce5e9936bbd..19bc44776c9 100644 --- a/library/core/src/iter/adapters/chain.rs +++ b/library/core/src/iter/adapters/chain.rs @@ -1,5 +1,5 @@ use crate::iter::{DoubleEndedIterator, FusedIterator, Iterator, TrustedLen}; -use crate::ops::Try; +use crate::ops::TryWhereOutputEquals; /// An iterator that links two iterators together, in a chain. /// @@ -98,7 +98,7 @@ fn try_fold(&mut self, mut acc: Acc, mut f: F) -> R where Self: Sized, F: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { if let Some(ref mut a) = self.a { acc = a.try_fold(acc, &mut f)?; @@ -281,7 +281,7 @@ fn try_rfold(&mut self, mut acc: Acc, mut f: F) -> R where Self: Sized, F: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { if let Some(ref mut b) = self.b { acc = b.try_rfold(acc, &mut f)?; diff --git a/library/core/src/iter/adapters/cloned.rs b/library/core/src/iter/adapters/cloned.rs index 0abdbba2ef1..b0344ce1388 100644 --- a/library/core/src/iter/adapters/cloned.rs +++ b/library/core/src/iter/adapters/cloned.rs @@ -1,6 +1,6 @@ use crate::iter::adapters::{zip::try_get_unchecked, TrustedRandomAccess}; use crate::iter::{FusedIterator, TrustedLen}; -use crate::ops::Try; +use crate::ops::TryWhereOutputEquals; /// An iterator that clones the elements of an underlying iterator. /// @@ -46,7 +46,7 @@ fn try_fold(&mut self, init: B, f: F) -> R where Self: Sized, F: FnMut(B, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.it.try_fold(init, clone_try_fold(f)) } @@ -82,7 +82,7 @@ fn try_rfold(&mut self, init: B, f: F) -> R where Self: Sized, F: FnMut(B, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.it.try_rfold(init, clone_try_fold(f)) } diff --git a/library/core/src/iter/adapters/copied.rs b/library/core/src/iter/adapters/copied.rs index 0a5822452a3..d261effc104 100644 --- a/library/core/src/iter/adapters/copied.rs +++ b/library/core/src/iter/adapters/copied.rs @@ -1,6 +1,6 @@ use crate::iter::adapters::{zip::try_get_unchecked, TrustedRandomAccess}; use crate::iter::{FusedIterator, TrustedLen}; -use crate::ops::Try; +use crate::ops::TryWhereOutputEquals; /// An iterator that copies the elements of an underlying iterator. /// @@ -50,7 +50,7 @@ fn try_fold(&mut self, init: B, f: F) -> R where Self: Sized, F: FnMut(B, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.it.try_fold(init, copy_try_fold(f)) } @@ -98,7 +98,7 @@ fn try_rfold(&mut self, init: B, f: F) -> R where Self: Sized, F: FnMut(B, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.it.try_rfold(init, copy_try_fold(f)) } diff --git a/library/core/src/iter/adapters/cycle.rs b/library/core/src/iter/adapters/cycle.rs index 6e9a011f819..5704dc35901 100644 --- a/library/core/src/iter/adapters/cycle.rs +++ b/library/core/src/iter/adapters/cycle.rs @@ -1,4 +1,4 @@ -use crate::{iter::FusedIterator, ops::Try}; +use crate::{iter::FusedIterator, ops::TryWhereOutputEquals}; /// An iterator that repeats endlessly. /// @@ -53,7 +53,7 @@ fn size_hint(&self) -> (usize, Option) { fn try_fold(&mut self, mut acc: Acc, mut f: F) -> R where F: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { // fully iterate the current iterator. this is necessary because // `self.iter` may be empty even when `self.orig` isn't diff --git a/library/core/src/iter/adapters/enumerate.rs b/library/core/src/iter/adapters/enumerate.rs index 73cee1df30c..8b37cc4d4a5 100644 --- a/library/core/src/iter/adapters/enumerate.rs +++ b/library/core/src/iter/adapters/enumerate.rs @@ -1,6 +1,6 @@ use crate::iter::adapters::{zip::try_get_unchecked, SourceIter, TrustedRandomAccess}; use crate::iter::{FusedIterator, InPlaceIterable, TrustedLen}; -use crate::ops::Try; +use crate::ops::TryWhereOutputEquals; /// An iterator that yields the current count and the element during iteration. /// @@ -71,7 +71,7 @@ fn try_fold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { #[inline] fn enumerate<'a, T, Acc, R>( @@ -150,7 +150,7 @@ fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { // Can safely add and subtract the count, as `ExactSizeIterator` promises // that the number of elements fits into a `usize`. diff --git a/library/core/src/iter/adapters/filter.rs b/library/core/src/iter/adapters/filter.rs index 0337892b9e8..8f5484c9a5c 100644 --- a/library/core/src/iter/adapters/filter.rs +++ b/library/core/src/iter/adapters/filter.rs @@ -1,6 +1,6 @@ use crate::fmt; use crate::iter::{adapters::SourceIter, FusedIterator, InPlaceIterable}; -use crate::ops::Try; +use crate::ops::TryWhereOutputEquals; /// An iterator that filters the elements of `iter` with `predicate`. /// @@ -37,7 +37,7 @@ fn filter_fold( move |acc, item| if predicate(&item) { fold(acc, item) } else { acc } } -fn filter_try_fold<'a, T, Acc, R: Try>( +fn filter_try_fold<'a, T, Acc, R: TryWhereOutputEquals>( predicate: &'a mut impl FnMut(&T) -> bool, mut fold: impl FnMut(Acc, T) -> R + 'a, ) -> impl FnMut(Acc, T) -> R + 'a { @@ -88,7 +88,7 @@ fn try_fold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.iter.try_fold(init, filter_try_fold(&mut self.predicate, fold)) } @@ -117,7 +117,7 @@ fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.iter.try_rfold(init, filter_try_fold(&mut self.predicate, fold)) } diff --git a/library/core/src/iter/adapters/filter_map.rs b/library/core/src/iter/adapters/filter_map.rs index 0dccf2c533b..308f984cd94 100644 --- a/library/core/src/iter/adapters/filter_map.rs +++ b/library/core/src/iter/adapters/filter_map.rs @@ -1,6 +1,6 @@ use crate::fmt; use crate::iter::{adapters::SourceIter, FusedIterator, InPlaceIterable}; -use crate::ops::{ControlFlow, Try}; +use crate::ops::{ControlFlow, TryWhereOutputEquals}; /// An iterator that uses `f` to both filter and map elements from `iter`. /// @@ -39,7 +39,7 @@ fn filter_map_fold( } } -fn filter_map_try_fold<'a, T, B, Acc, R: Try>( +fn filter_map_try_fold<'a, T, B, Acc, R: TryWhereOutputEquals>( f: &'a mut impl FnMut(T) -> Option, mut fold: impl FnMut(Acc, B) -> R + 'a, ) -> impl FnMut(Acc, T) -> R + 'a { @@ -72,7 +72,7 @@ fn try_fold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.iter.try_fold(init, filter_map_try_fold(&mut self.f, fold)) } @@ -111,7 +111,7 @@ fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.iter.try_rfold(init, filter_map_try_fold(&mut self.f, fold)) } diff --git a/library/core/src/iter/adapters/flatten.rs b/library/core/src/iter/adapters/flatten.rs index 0114d7af4f4..b2fe1499ca6 100644 --- a/library/core/src/iter/adapters/flatten.rs +++ b/library/core/src/iter/adapters/flatten.rs @@ -1,6 +1,6 @@ use crate::fmt; use crate::iter::{DoubleEndedIterator, Fuse, FusedIterator, Iterator, Map}; -use crate::ops::Try; +use crate::ops::TryWhereOutputEquals; /// An iterator that maps each element to an iterator, and yields the elements /// of the produced iterators. @@ -61,7 +61,7 @@ fn try_fold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.inner.try_fold(init, fold) } @@ -91,7 +91,7 @@ fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.inner.try_rfold(init, fold) } @@ -178,7 +178,7 @@ fn try_fold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.inner.try_fold(init, fold) } @@ -208,7 +208,7 @@ fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.inner.try_rfold(init, fold) } @@ -293,10 +293,10 @@ fn try_fold(&mut self, mut init: Acc, mut fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { #[inline] - fn flatten<'a, T: IntoIterator, Acc, R: Try>( + fn flatten<'a, T: IntoIterator, Acc, R: TryWhereOutputEquals>( frontiter: &'a mut Option, fold: &'a mut impl FnMut(Acc, T::Item) -> R, ) -> impl FnMut(Acc, T) -> R + 'a { @@ -382,10 +382,10 @@ fn try_rfold(&mut self, mut init: Acc, mut fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { #[inline] - fn flatten<'a, T: IntoIterator, Acc, R: Try>( + fn flatten<'a, T: IntoIterator, Acc, R: TryWhereOutputEquals>( backiter: &'a mut Option, fold: &'a mut impl FnMut(Acc, T::Item) -> R, ) -> impl FnMut(Acc, T) -> R + 'a diff --git a/library/core/src/iter/adapters/fuse.rs b/library/core/src/iter/adapters/fuse.rs index c01f384dec5..43d0626e3b7 100644 --- a/library/core/src/iter/adapters/fuse.rs +++ b/library/core/src/iter/adapters/fuse.rs @@ -3,7 +3,7 @@ use crate::iter::{ DoubleEndedIterator, ExactSizeIterator, FusedIterator, TrustedLen, TrustedRandomAccess, }; -use crate::ops::Try; +use crate::ops::TryWhereOutputEquals; /// An iterator that yields `None` forever after the underlying iterator /// yields `None` once. @@ -92,7 +92,7 @@ fn try_fold(&mut self, acc: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { FuseImpl::try_fold(self, acc, fold) } @@ -148,7 +148,7 @@ fn try_rfold(&mut self, acc: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { FuseImpl::try_rfold(self, acc, fold) } @@ -219,7 +219,7 @@ fn try_fold(&mut self, acc: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try; + R: TryWhereOutputEquals; fn fold(self, acc: Acc, fold: Fold) -> Acc where Fold: FnMut(Acc, Self::Item) -> Acc; @@ -238,7 +238,7 @@ fn try_rfold(&mut self, acc: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, I: DoubleEndedIterator; fn rfold(self, acc: Acc, fold: Fold) -> Acc where @@ -305,7 +305,7 @@ impl FuseImpl for Fuse where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { if let Some(ref mut iter) = self.iter { acc = iter.try_fold(acc, fold)?; @@ -354,7 +354,7 @@ impl FuseImpl for Fuse where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, I: DoubleEndedIterator, { if let Some(ref mut iter) = self.iter { @@ -443,7 +443,7 @@ fn try_fold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { unchecked!(self).try_fold(init, fold) } @@ -485,7 +485,7 @@ fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, I: DoubleEndedIterator, { unchecked!(self).try_rfold(init, fold) diff --git a/library/core/src/iter/adapters/inspect.rs b/library/core/src/iter/adapters/inspect.rs index 88f5ee61b6b..3221a0eeafa 100644 --- a/library/core/src/iter/adapters/inspect.rs +++ b/library/core/src/iter/adapters/inspect.rs @@ -1,6 +1,6 @@ use crate::fmt; use crate::iter::{adapters::SourceIter, FusedIterator, InPlaceIterable}; -use crate::ops::Try; +use crate::ops::TryWhereOutputEquals; /// An iterator that calls a function with a reference to each element before /// yielding it. @@ -87,7 +87,7 @@ fn try_fold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.iter.try_fold(init, inspect_try_fold(&mut self.f, fold)) } @@ -117,7 +117,7 @@ fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.iter.try_rfold(init, inspect_try_fold(&mut self.f, fold)) } diff --git a/library/core/src/iter/adapters/map.rs b/library/core/src/iter/adapters/map.rs index 2a4b7efd5e6..8ca7adb013f 100644 --- a/library/core/src/iter/adapters/map.rs +++ b/library/core/src/iter/adapters/map.rs @@ -1,7 +1,7 @@ use crate::fmt; use crate::iter::adapters::{zip::try_get_unchecked, SourceIter, TrustedRandomAccess}; use crate::iter::{FusedIterator, InPlaceIterable, TrustedLen}; -use crate::ops::Try; +use crate::ops::TryWhereOutputEquals; /// An iterator that maps the values of `iter` with `f`. /// @@ -110,7 +110,7 @@ fn try_fold(&mut self, init: Acc, g: G) -> R where Self: Sized, G: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.iter.try_fold(init, map_try_fold(&mut self.f, g)) } @@ -146,7 +146,7 @@ fn try_rfold(&mut self, init: Acc, g: G) -> R where Self: Sized, G: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.iter.try_rfold(init, map_try_fold(&mut self.f, g)) } diff --git a/library/core/src/iter/adapters/map_while.rs b/library/core/src/iter/adapters/map_while.rs index 26114d53284..ab16dbdb073 100644 --- a/library/core/src/iter/adapters/map_while.rs +++ b/library/core/src/iter/adapters/map_while.rs @@ -1,6 +1,6 @@ use crate::fmt; use crate::iter::{adapters::SourceIter, InPlaceIterable}; -use crate::ops::{ControlFlow, Try}; +use crate::ops::{ControlFlow, TryWhereOutputEquals}; /// An iterator that only accepts elements while `predicate` returns `Some(_)`. /// @@ -54,7 +54,7 @@ fn try_fold(&mut self, init: Acc, mut fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { let Self { iter, predicate } = self; iter.try_fold(init, |acc, x| match predicate(x) { diff --git a/library/core/src/iter/adapters/mod.rs b/library/core/src/iter/adapters/mod.rs index 61d8351d59f..048d209561b 100644 --- a/library/core/src/iter/adapters/mod.rs +++ b/library/core/src/iter/adapters/mod.rs @@ -1,5 +1,5 @@ use crate::iter::{InPlaceIterable, Iterator}; -use crate::ops::{ControlFlow, Try}; +use crate::ops::{ControlFlow, TryWhereOutputEquals}; mod chain; mod cloned; @@ -167,7 +167,7 @@ fn size_hint(&self) -> (usize, Option) { fn try_fold(&mut self, init: B, mut f: F) -> R where F: FnMut(B, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { let error = &mut *self.error; self.iter diff --git a/library/core/src/iter/adapters/peekable.rs b/library/core/src/iter/adapters/peekable.rs index 21386e28a96..7e851c67de4 100644 --- a/library/core/src/iter/adapters/peekable.rs +++ b/library/core/src/iter/adapters/peekable.rs @@ -1,5 +1,5 @@ use crate::iter::{adapters::SourceIter, FusedIterator, InPlaceIterable, TrustedLen}; -use crate::ops::Try; +use crate::ops::TryWhereOutputEquals; /// An iterator with a `peek()` that returns an optional reference to the next /// element. @@ -91,7 +91,7 @@ fn try_fold(&mut self, init: B, mut f: F) -> R where Self: Sized, F: FnMut(B, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { let acc = match self.peeked.take() { Some(None) => return try { init }, @@ -134,7 +134,7 @@ fn try_rfold(&mut self, init: B, mut f: F) -> R where Self: Sized, F: FnMut(B, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { match self.peeked.take() { Some(None) => try { init }, @@ -142,7 +142,7 @@ fn try_rfold(&mut self, init: B, mut f: F) -> R Ok(acc) => f(acc, v), Err(e) => { self.peeked = Some(Some(v)); - Try::from_error(e) + R::from_error(e) } }, None => self.iter.try_rfold(init, f), diff --git a/library/core/src/iter/adapters/rev.rs b/library/core/src/iter/adapters/rev.rs index 105ed40a3ed..f24bde9f6ad 100644 --- a/library/core/src/iter/adapters/rev.rs +++ b/library/core/src/iter/adapters/rev.rs @@ -1,5 +1,5 @@ use crate::iter::{FusedIterator, TrustedLen}; -use crate::ops::Try; +use crate::ops::TryWhereOutputEquals; /// A double-ended iterator with the direction inverted. /// @@ -51,7 +51,7 @@ fn try_fold(&mut self, init: B, f: F) -> R where Self: Sized, F: FnMut(B, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.iter.try_rfold(init, f) } @@ -96,7 +96,7 @@ fn try_rfold(&mut self, init: B, f: F) -> R where Self: Sized, F: FnMut(B, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { self.iter.try_fold(init, f) } diff --git a/library/core/src/iter/adapters/scan.rs b/library/core/src/iter/adapters/scan.rs index 0214899295e..38a3f255389 100644 --- a/library/core/src/iter/adapters/scan.rs +++ b/library/core/src/iter/adapters/scan.rs @@ -1,6 +1,6 @@ use crate::fmt; use crate::iter::{adapters::SourceIter, InPlaceIterable}; -use crate::ops::{ControlFlow, Try}; +use crate::ops::{ControlFlow, TryWhereOutputEquals}; /// An iterator to maintain state while iterating another iterator. /// @@ -56,9 +56,9 @@ fn try_fold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { - fn scan<'a, T, St, B, Acc, R: Try>( + fn scan<'a, T, St, B, Acc, R: TryWhereOutputEquals>( state: &'a mut St, f: &'a mut impl FnMut(&mut St, T) -> Option, mut fold: impl FnMut(Acc, B) -> R + 'a, diff --git a/library/core/src/iter/adapters/skip.rs b/library/core/src/iter/adapters/skip.rs index e55c7a6bf5d..bee160baaad 100644 --- a/library/core/src/iter/adapters/skip.rs +++ b/library/core/src/iter/adapters/skip.rs @@ -1,6 +1,6 @@ use crate::intrinsics::unlikely; use crate::iter::{adapters::SourceIter, FusedIterator, InPlaceIterable}; -use crate::ops::{ControlFlow, Try}; +use crate::ops::{ControlFlow, TryWhereOutputEquals}; /// An iterator that skips over `n` elements of `iter`. /// @@ -88,7 +88,7 @@ fn try_fold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { let n = self.n; self.n = 0; @@ -146,9 +146,9 @@ fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { - fn check>( + fn check>( mut n: usize, mut fold: impl FnMut(Acc, T) -> R, ) -> impl FnMut(Acc, T) -> ControlFlow { diff --git a/library/core/src/iter/adapters/skip_while.rs b/library/core/src/iter/adapters/skip_while.rs index efcb469fc95..3c679187c62 100644 --- a/library/core/src/iter/adapters/skip_while.rs +++ b/library/core/src/iter/adapters/skip_while.rs @@ -1,6 +1,6 @@ use crate::fmt; use crate::iter::{adapters::SourceIter, FusedIterator, InPlaceIterable}; -use crate::ops::Try; +use crate::ops::TryWhereOutputEquals; /// An iterator that rejects elements while `predicate` returns `true`. /// @@ -70,7 +70,7 @@ fn try_fold(&mut self, mut init: Acc, mut fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { if !self.flag { match self.next() { diff --git a/library/core/src/iter/adapters/step_by.rs b/library/core/src/iter/adapters/step_by.rs index 2ba56eeccba..ad29bff213c 100644 --- a/library/core/src/iter/adapters/step_by.rs +++ b/library/core/src/iter/adapters/step_by.rs @@ -1,4 +1,4 @@ -use crate::{intrinsics, iter::from_fn, ops::Try}; +use crate::{intrinsics, iter::from_fn, ops::TryWhereOutputEquals}; /// An iterator for stepping iterators by a custom amount. /// @@ -111,7 +111,7 @@ fn nth(&mut self, mut n: usize) -> Option { fn try_fold(&mut self, mut acc: Acc, mut f: F) -> R where F: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { #[inline] fn nth(iter: &mut I, step: usize) -> impl FnMut() -> Option + '_ { @@ -187,7 +187,7 @@ fn nth_back(&mut self, n: usize) -> Option { fn try_rfold(&mut self, init: Acc, mut f: F) -> R where F: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { #[inline] fn nth_back( diff --git a/library/core/src/iter/adapters/take.rs b/library/core/src/iter/adapters/take.rs index 54a47f1323e..4852efebdf4 100644 --- a/library/core/src/iter/adapters/take.rs +++ b/library/core/src/iter/adapters/take.rs @@ -3,7 +3,7 @@ adapters::zip::try_get_unchecked, adapters::SourceIter, FusedIterator, InPlaceIterable, TrustedLen, TrustedRandomAccess, }; -use crate::ops::{ControlFlow, Try}; +use crate::ops::{ControlFlow, TryWhereOutputEquals}; /// An iterator that only iterates over the first `n` iterations of `iter`. /// @@ -80,9 +80,9 @@ fn try_fold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { - fn check<'a, T, Acc, R: Try>( + fn check<'a, T, Acc, R: TryWhereOutputEquals>( n: &'a mut usize, mut fold: impl FnMut(Acc, T) -> R + 'a, ) -> impl FnMut(Acc, T) -> ControlFlow + 'a { @@ -178,7 +178,7 @@ fn try_rfold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { if self.n == 0 { try { init } diff --git a/library/core/src/iter/adapters/take_while.rs b/library/core/src/iter/adapters/take_while.rs index 746eb41f4c3..d97d3141496 100644 --- a/library/core/src/iter/adapters/take_while.rs +++ b/library/core/src/iter/adapters/take_while.rs @@ -1,6 +1,6 @@ use crate::fmt; use crate::iter::{adapters::SourceIter, FusedIterator, InPlaceIterable}; -use crate::ops::{ControlFlow, Try}; +use crate::ops::{ControlFlow, TryWhereOutputEquals}; /// An iterator that only accepts elements while `predicate` returns `true`. /// @@ -68,9 +68,9 @@ fn try_fold(&mut self, init: Acc, fold: Fold) -> R where Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { - fn check<'a, T, Acc, R: Try>( + fn check<'a, T, Acc, R: TryWhereOutputEquals>( flag: &'a mut bool, p: &'a mut impl FnMut(&T) -> bool, mut fold: impl FnMut(Acc, T) -> R + 'a, diff --git a/library/core/src/iter/range.rs b/library/core/src/iter/range.rs index 4b293c596e7..d3da6066654 100644 --- a/library/core/src/iter/range.rs +++ b/library/core/src/iter/range.rs @@ -1,7 +1,7 @@ use crate::char; use crate::convert::TryFrom; use crate::mem; -use crate::ops::{self, Try}; +use crate::ops::{self, TryWhereOutputEquals}; use super::{FusedIterator, TrustedLen, TrustedRandomAccess}; @@ -755,7 +755,7 @@ fn try_fold(&mut self, init: B, mut f: F) -> R where Self: Sized, F: FnMut(B, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { if self.is_empty() { return try { init }; @@ -860,7 +860,7 @@ fn try_rfold(&mut self, init: B, mut f: F) -> R where Self: Sized, F: FnMut(B, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { if self.is_empty() { return try { init }; diff --git a/library/core/src/iter/traits/double_ended.rs b/library/core/src/iter/traits/double_ended.rs index 6f8cb6b5a65..aed48a48dde 100644 --- a/library/core/src/iter/traits/double_ended.rs +++ b/library/core/src/iter/traits/double_ended.rs @@ -1,4 +1,4 @@ -use crate::ops::{ControlFlow, Try}; +use crate::ops::{ControlFlow, TryWhereOutputEquals}; /// An iterator able to yield elements from both ends. /// @@ -218,7 +218,7 @@ fn try_rfold(&mut self, init: B, mut f: F) -> R where Self: Sized, F: FnMut(B, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { let mut accum = init; while let Some(x) = self.next_back() { diff --git a/library/core/src/iter/traits/iterator.rs b/library/core/src/iter/traits/iterator.rs index da9e5fde7cc..30f47443ecb 100644 --- a/library/core/src/iter/traits/iterator.rs +++ b/library/core/src/iter/traits/iterator.rs @@ -3,7 +3,7 @@ // can't split that into multiple files. use crate::cmp::{self, Ordering}; -use crate::ops::{ControlFlow, Try}; +use crate::ops::{ControlFlow, TryWhereOutputEquals}; use super::super::TrustedRandomAccess; use super::super::{Chain, Cloned, Copied, Cycle, Enumerate, Filter, FilterMap, Fuse}; @@ -1999,7 +1999,7 @@ fn try_fold(&mut self, init: B, mut f: F) -> R where Self: Sized, F: FnMut(B, Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { let mut accum = init; while let Some(x) = self.next() { @@ -2041,7 +2041,7 @@ fn try_for_each(&mut self, f: F) -> R where Self: Sized, F: FnMut(Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals<()>, { #[inline] fn call(mut f: impl FnMut(T) -> R) -> impl FnMut((), T) -> R { @@ -2416,13 +2416,13 @@ fn try_find(&mut self, f: F) -> Result, R::Error> where Self: Sized, F: FnMut(&Self::Item) -> R, - R: Try, + R: TryWhereOutputEquals, { #[inline] fn check(mut f: F) -> impl FnMut((), T) -> ControlFlow> where F: FnMut(&T) -> R, - R: Try, + R: TryWhereOutputEquals, { move |(), x| match f(&x).into_result() { Ok(false) => ControlFlow::CONTINUE, diff --git a/library/core/src/ops/control_flow.rs b/library/core/src/ops/control_flow.rs index ecaff053bd5..b5ac590b59d 100644 --- a/library/core/src/ops/control_flow.rs +++ b/library/core/src/ops/control_flow.rs @@ -1,5 +1,4 @@ -use crate::convert; -use crate::ops::{self, Try}; +use crate::{convert, ops}; /// Used to tell an operation whether it should exit early or go on as usual. /// @@ -62,7 +61,7 @@ pub enum ControlFlow { } #[unstable(feature = "control_flow_enum", reason = "new API", issue = "75744")] -impl Try for ControlFlow { +impl ops::TryV1 for ControlFlow { type Ok = C; type Error = B; #[inline] @@ -182,14 +181,14 @@ pub fn map_break(self, f: F) -> ControlFlow } } -impl ControlFlow { +impl ControlFlow { /// Create a `ControlFlow` from any type implementing `Try`. #[unstable(feature = "control_flow_enum", reason = "new API", issue = "75744")] #[inline] pub fn from_try(r: R) -> Self { - match Try::into_result(r) { + match R::into_result(r) { Ok(v) => ControlFlow::Continue(v), - Err(v) => ControlFlow::Break(Try::from_error(v)), + Err(v) => ControlFlow::Break(R::from_error(v)), } } @@ -198,7 +197,7 @@ pub fn from_try(r: R) -> Self { #[inline] pub fn into_try(self) -> R { match self { - ControlFlow::Continue(v) => Try::from_ok(v), + ControlFlow::Continue(v) => R::from_ok(v), ControlFlow::Break(v) => v, } } diff --git a/library/core/src/ops/mod.rs b/library/core/src/ops/mod.rs index 1b07936ccde..7f747ced397 100644 --- a/library/core/src/ops/mod.rs +++ b/library/core/src/ops/mod.rs @@ -185,6 +185,9 @@ #[unstable(feature = "try_trait", issue = "42327")] pub use self::r#try::Try; +#[unstable(feature = "try_trait_transition", reason = "for bootstrap", issue = "none")] +pub use self::r#try::Try as TryV1; + #[unstable(feature = "try_trait_v2", issue = "84277")] pub use self::try_trait::FromResidual; @@ -202,3 +205,19 @@ #[unstable(feature = "control_flow_enum", reason = "new API", issue = "75744")] pub use self::control_flow::ControlFlow; + +/// [`TryV1`] and [`TryV2`] have different associated type names, +/// so rather than need `bootstrap` checks all over the library, +/// centralize the difference to this one trait alias. +/// +/// As with all `try_trait_transition` stuff, this will be deleted +/// after the bootstrap compiler uses V2 for `?`. +/// +/// ``` +/// #![feature(try_trait_transition)] +/// use std::ops::TryWhereOutputEquals; +/// fn foo() where T: TryWhereOutputEquals {} +/// foo::, i32>(); +/// ``` +#[unstable(feature = "try_trait_transition", reason = "for bootstrap", issue = "none")] +pub trait TryWhereOutputEquals = TryV1; diff --git a/library/core/src/option.rs b/library/core/src/option.rs index 04551dded8c..928d8441fa6 100644 --- a/library/core/src/option.rs +++ b/library/core/src/option.rs @@ -1644,7 +1644,7 @@ fn from_iter>>(iter: I) -> Option { pub struct NoneError; #[unstable(feature = "try_trait", issue = "42327")] -impl ops::Try for Option { +impl ops::TryV1 for Option { type Ok = T; type Error = NoneError; diff --git a/library/core/src/result.rs b/library/core/src/result.rs index e0071f806aa..5f6afcc8221 100644 --- a/library/core/src/result.rs +++ b/library/core/src/result.rs @@ -1627,7 +1627,7 @@ fn from_iter>>(iter: I) -> Result { } #[unstable(feature = "try_trait", issue = "42327")] -impl ops::Try for Result { +impl ops::TryV1 for Result { type Ok = T; type Error = E; diff --git a/library/core/src/slice/ascii.rs b/library/core/src/slice/ascii.rs index 906dcb1e8bc..c3ba8b23e8d 100644 --- a/library/core/src/slice/ascii.rs +++ b/library/core/src/slice/ascii.rs @@ -110,7 +110,7 @@ fn size_hint(&self) -> (usize, Option) { fn try_fold(&mut self, init: Acc, fold: Fold) -> R where Fold: FnMut(Acc, Self::Item) -> R, - R: ops::Try, + R: ops::TryWhereOutputEquals, { self.inner.try_fold(init, fold) } diff --git a/library/core/src/str/iter.rs b/library/core/src/str/iter.rs index 724137aba9f..612f17a1e61 100644 --- a/library/core/src/str/iter.rs +++ b/library/core/src/str/iter.rs @@ -5,7 +5,7 @@ use crate::iter::TrustedRandomAccess; use crate::iter::{Chain, FlatMap, Flatten}; use crate::iter::{Copied, Filter, FusedIterator, Map, TrustedLen}; -use crate::ops::Try; +use crate::ops::TryWhereOutputEquals; use crate::option; use crate::slice::{self, Split as SliceSplit}; @@ -1467,7 +1467,7 @@ fn size_hint(&self) -> (usize, Option) { self.inner.size_hint() } #[inline] fn try_fold(&mut self, init: Acc, fold: Fold) -> R where - Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try + Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: TryWhereOutputEquals { self.inner.try_fold(init, fold) } diff --git a/library/core/src/task/poll.rs b/library/core/src/task/poll.rs index 2765c21a46d..2ccfc22c27c 100644 --- a/library/core/src/task/poll.rs +++ b/library/core/src/task/poll.rs @@ -1,7 +1,7 @@ #![stable(feature = "futures_api", since = "1.36.0")] use crate::convert; -use crate::ops::{self, ControlFlow, Try}; +use crate::ops::{self, ControlFlow}; use crate::result::Result; /// Indicates whether a value is available or if the current task has been @@ -129,7 +129,7 @@ fn from(t: T) -> Poll { } #[stable(feature = "futures_api", since = "1.36.0")] -impl Try for Poll> { +impl ops::TryV1 for Poll> { type Ok = Poll; type Error = E; @@ -184,7 +184,7 @@ fn from_residual(x: Result) -> Self { } #[stable(feature = "futures_api", since = "1.36.0")] -impl Try for Poll>> { +impl ops::TryV1 for Poll>> { type Ok = Poll>; type Error = E;