Perf Experiment: Wait, what if I just skip the trait alias

This commit is contained in:
Scott McMurray
2021-05-05 22:47:02 -07:00
parent 3d9660111c
commit b7a6c4a905
34 changed files with 110 additions and 131 deletions

View File

@@ -1,6 +1,6 @@
use core::fmt;
use core::iter::{FusedIterator, TrustedLen, TrustedRandomAccess};
use core::ops::TryWhereOutputEquals;
use core::ops::Try;
use super::{count, wrap_index, RingSlices};
@@ -66,7 +66,7 @@ impl<'a, T> Iterator for Iter<'a, T> {
where
Self: Sized,
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
let (mut iter, final_res);
if self.tail <= self.head {
@@ -140,7 +140,7 @@ impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
where
Self: Sized,
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
let (mut iter, final_res);
if self.tail <= self.head {

View File

@@ -141,7 +141,7 @@
#![feature(alloc_layout_extra)]
#![feature(trusted_random_access)]
#![feature(try_trait)]
#![feature(try_trait_transition)]
#![feature(try_trait_v2)]
#![feature(min_type_alias_impl_trait)]
#![feature(associated_type_bounds)]
#![feature(slice_group_by)]

View File

@@ -1,5 +1,5 @@
use crate::iter::{DoubleEndedIterator, FusedIterator, Iterator, TrustedLen};
use crate::ops::TryWhereOutputEquals;
use crate::ops::Try;
/// An iterator that links two iterators together, in a chain.
///
@@ -98,7 +98,7 @@ where
where
Self: Sized,
F: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
if let Some(ref mut a) = self.a {
acc = a.try_fold(acc, &mut f)?;
@@ -281,7 +281,7 @@ where
where
Self: Sized,
F: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
if let Some(ref mut b) = self.b {
acc = b.try_rfold(acc, &mut f)?;

View File

@@ -1,6 +1,6 @@
use crate::iter::adapters::{zip::try_get_unchecked, TrustedRandomAccess};
use crate::iter::{FusedIterator, TrustedLen};
use crate::ops::TryWhereOutputEquals;
use crate::ops::Try;
/// An iterator that clones the elements of an underlying iterator.
///
@@ -46,7 +46,7 @@ where
where
Self: Sized,
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
self.it.try_fold(init, clone_try_fold(f))
}
@@ -82,7 +82,7 @@ where
where
Self: Sized,
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
self.it.try_rfold(init, clone_try_fold(f))
}

View File

@@ -1,6 +1,6 @@
use crate::iter::adapters::{zip::try_get_unchecked, TrustedRandomAccess};
use crate::iter::{FusedIterator, TrustedLen};
use crate::ops::TryWhereOutputEquals;
use crate::ops::Try;
/// An iterator that copies the elements of an underlying iterator.
///
@@ -50,7 +50,7 @@ where
where
Self: Sized,
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
self.it.try_fold(init, copy_try_fold(f))
}
@@ -98,7 +98,7 @@ where
where
Self: Sized,
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
self.it.try_rfold(init, copy_try_fold(f))
}

View File

@@ -1,4 +1,4 @@
use crate::{iter::FusedIterator, ops::TryWhereOutputEquals};
use crate::{iter::FusedIterator, ops::Try};
/// An iterator that repeats endlessly.
///
@@ -53,7 +53,7 @@ where
fn try_fold<Acc, F, R>(&mut self, mut acc: Acc, mut f: F) -> R
where
F: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
// fully iterate the current iterator. this is necessary because
// `self.iter` may be empty even when `self.orig` isn't

View File

@@ -1,6 +1,6 @@
use crate::iter::adapters::{zip::try_get_unchecked, SourceIter, TrustedRandomAccess};
use crate::iter::{FusedIterator, InPlaceIterable, TrustedLen};
use crate::ops::TryWhereOutputEquals;
use crate::ops::Try;
/// An iterator that yields the current count and the element during iteration.
///
@@ -71,7 +71,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
#[inline]
fn enumerate<'a, T, Acc, R>(
@@ -150,7 +150,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
// Can safely add and subtract the count, as `ExactSizeIterator` promises
// that the number of elements fits into a `usize`.

View File

@@ -1,6 +1,6 @@
use crate::fmt;
use crate::iter::{adapters::SourceIter, FusedIterator, InPlaceIterable};
use crate::ops::TryWhereOutputEquals;
use crate::ops::Try;
/// An iterator that filters the elements of `iter` with `predicate`.
///
@@ -37,7 +37,7 @@ fn filter_fold<T, Acc>(
move |acc, item| if predicate(&item) { fold(acc, item) } else { acc }
}
fn filter_try_fold<'a, T, Acc, R: TryWhereOutputEquals<Acc>>(
fn filter_try_fold<'a, T, Acc, R: Try<Output = Acc>>(
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 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
self.iter.try_fold(init, filter_try_fold(&mut self.predicate, fold))
}
@@ -117,7 +117,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
self.iter.try_rfold(init, filter_try_fold(&mut self.predicate, fold))
}

View File

@@ -1,6 +1,6 @@
use crate::fmt;
use crate::iter::{adapters::SourceIter, FusedIterator, InPlaceIterable};
use crate::ops::{ControlFlow, TryWhereOutputEquals};
use crate::ops::{ControlFlow, Try};
/// An iterator that uses `f` to both filter and map elements from `iter`.
///
@@ -39,7 +39,7 @@ fn filter_map_fold<T, B, Acc>(
}
}
fn filter_map_try_fold<'a, T, B, Acc, R: TryWhereOutputEquals<Acc>>(
fn filter_map_try_fold<'a, T, B, Acc, R: Try<Output = Acc>>(
f: &'a mut impl FnMut(T) -> Option<B>,
mut fold: impl FnMut(Acc, B) -> R + 'a,
) -> impl FnMut(Acc, T) -> R + 'a {
@@ -72,7 +72,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
self.iter.try_fold(init, filter_map_try_fold(&mut self.f, fold))
}
@@ -111,7 +111,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
self.iter.try_rfold(init, filter_map_try_fold(&mut self.f, fold))
}

View File

@@ -1,6 +1,6 @@
use crate::fmt;
use crate::iter::{DoubleEndedIterator, Fuse, FusedIterator, Iterator, Map};
use crate::ops::TryWhereOutputEquals;
use crate::ops::Try;
/// An iterator that maps each element to an iterator, and yields the elements
/// of the produced iterators.
@@ -61,7 +61,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
self.inner.try_fold(init, fold)
}
@@ -91,7 +91,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
self.inner.try_rfold(init, fold)
}
@@ -178,7 +178,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
self.inner.try_fold(init, fold)
}
@@ -208,7 +208,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
self.inner.try_rfold(init, fold)
}
@@ -293,10 +293,10 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
#[inline]
fn flatten<'a, T: IntoIterator, Acc, R: TryWhereOutputEquals<Acc>>(
fn flatten<'a, T: IntoIterator, Acc, R: Try<Output = Acc>>(
frontiter: &'a mut Option<T::IntoIter>,
fold: &'a mut impl FnMut(Acc, T::Item) -> R,
) -> impl FnMut(Acc, T) -> R + 'a {
@@ -382,10 +382,10 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
#[inline]
fn flatten<'a, T: IntoIterator, Acc, R: TryWhereOutputEquals<Acc>>(
fn flatten<'a, T: IntoIterator, Acc, R: Try<Output = Acc>>(
backiter: &'a mut Option<T::IntoIter>,
fold: &'a mut impl FnMut(Acc, T::Item) -> R,
) -> impl FnMut(Acc, T) -> R + 'a

View File

@@ -3,7 +3,7 @@ use crate::iter::adapters::{zip::try_get_unchecked, InPlaceIterable, SourceIter}
use crate::iter::{
DoubleEndedIterator, ExactSizeIterator, FusedIterator, TrustedLen, TrustedRandomAccess,
};
use crate::ops::TryWhereOutputEquals;
use crate::ops::Try;
/// An iterator that yields `None` forever after the underlying iterator
/// yields `None` once.
@@ -92,7 +92,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
FuseImpl::try_fold(self, acc, fold)
}
@@ -148,7 +148,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
FuseImpl::try_rfold(self, acc, fold)
}
@@ -219,7 +219,7 @@ trait FuseImpl<I> {
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>;
R: Try<Output = Acc>;
fn fold<Acc, Fold>(self, acc: Acc, fold: Fold) -> Acc
where
Fold: FnMut(Acc, Self::Item) -> Acc;
@@ -238,7 +238,7 @@ trait FuseImpl<I> {
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
I: DoubleEndedIterator;
fn rfold<Acc, Fold>(self, acc: Acc, fold: Fold) -> Acc
where
@@ -305,7 +305,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
if let Some(ref mut iter) = self.iter {
acc = iter.try_fold(acc, fold)?;
@@ -354,7 +354,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
I: DoubleEndedIterator,
{
if let Some(ref mut iter) = self.iter {
@@ -443,7 +443,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
unchecked!(self).try_fold(init, fold)
}
@@ -485,7 +485,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
I: DoubleEndedIterator,
{
unchecked!(self).try_rfold(init, fold)

View File

@@ -1,6 +1,6 @@
use crate::fmt;
use crate::iter::{adapters::SourceIter, FusedIterator, InPlaceIterable};
use crate::ops::TryWhereOutputEquals;
use crate::ops::Try;
/// An iterator that calls a function with a reference to each element before
/// yielding it.
@@ -87,7 +87,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
self.iter.try_fold(init, inspect_try_fold(&mut self.f, fold))
}
@@ -117,7 +117,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
self.iter.try_rfold(init, inspect_try_fold(&mut self.f, fold))
}

View File

@@ -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::TryWhereOutputEquals;
use crate::ops::Try;
/// An iterator that maps the values of `iter` with `f`.
///
@@ -110,7 +110,7 @@ where
where
Self: Sized,
G: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
self.iter.try_fold(init, map_try_fold(&mut self.f, g))
}
@@ -146,7 +146,7 @@ where
where
Self: Sized,
G: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
self.iter.try_rfold(init, map_try_fold(&mut self.f, g))
}

View File

@@ -1,6 +1,6 @@
use crate::fmt;
use crate::iter::{adapters::SourceIter, InPlaceIterable};
use crate::ops::{ControlFlow, TryWhereOutputEquals};
use crate::ops::{ControlFlow, Try};
/// An iterator that only accepts elements while `predicate` returns `Some(_)`.
///
@@ -54,7 +54,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
let Self { iter, predicate } = self;
iter.try_fold(init, |acc, x| match predicate(x) {

View File

@@ -1,5 +1,5 @@
use crate::iter::{InPlaceIterable, Iterator};
use crate::ops::{ControlFlow, TryWhereOutputEquals};
use crate::ops::{ControlFlow, Try};
mod chain;
mod cloned;
@@ -167,7 +167,7 @@ where
fn try_fold<B, F, R>(&mut self, init: B, mut f: F) -> R
where
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
let error = &mut *self.error;
self.iter

View File

@@ -1,5 +1,5 @@
use crate::iter::{adapters::SourceIter, FusedIterator, InPlaceIterable, TrustedLen};
use crate::ops::{ControlFlow, TryWhereOutputEquals};
use crate::ops::{ControlFlow, Try};
/// An iterator with a `peek()` that returns an optional reference to the next
/// element.
@@ -91,7 +91,7 @@ impl<I: Iterator> Iterator for Peekable<I> {
where
Self: Sized,
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
let acc = match self.peeked.take() {
Some(None) => return try { init },
@@ -135,7 +135,7 @@ where
where
Self: Sized,
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
match self.peeked.take() {
Some(None) => try { init },
@@ -156,7 +156,7 @@ where
where
Self: Sized,
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
let _use_the_import: ControlFlow<()>;
match self.peeked.take() {

View File

@@ -1,5 +1,5 @@
use crate::iter::{FusedIterator, TrustedLen};
use crate::ops::TryWhereOutputEquals;
use crate::ops::Try;
/// A double-ended iterator with the direction inverted.
///
@@ -51,7 +51,7 @@ where
where
Self: Sized,
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
self.iter.try_rfold(init, f)
}
@@ -96,7 +96,7 @@ where
where
Self: Sized,
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
self.iter.try_fold(init, f)
}

View File

@@ -1,6 +1,6 @@
use crate::fmt;
use crate::iter::{adapters::SourceIter, InPlaceIterable};
use crate::ops::{ControlFlow, TryWhereOutputEquals};
use crate::ops::{ControlFlow, Try};
/// An iterator to maintain state while iterating another iterator.
///
@@ -56,9 +56,9 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
fn scan<'a, T, St, B, Acc, R: TryWhereOutputEquals<Acc>>(
fn scan<'a, T, St, B, Acc, R: Try<Output = Acc>>(
state: &'a mut St,
f: &'a mut impl FnMut(&mut St, T) -> Option<B>,
mut fold: impl FnMut(Acc, B) -> R + 'a,

View File

@@ -1,6 +1,6 @@
use crate::intrinsics::unlikely;
use crate::iter::{adapters::SourceIter, FusedIterator, InPlaceIterable};
use crate::ops::{ControlFlow, TryWhereOutputEquals};
use crate::ops::{ControlFlow, Try};
/// An iterator that skips over `n` elements of `iter`.
///
@@ -88,7 +88,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
let n = self.n;
self.n = 0;
@@ -146,9 +146,9 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
fn check<T, Acc, R: TryWhereOutputEquals<Acc>>(
fn check<T, Acc, R: Try<Output = Acc>>(
mut n: usize,
mut fold: impl FnMut(Acc, T) -> R,
) -> impl FnMut(Acc, T) -> ControlFlow<R, Acc> {

View File

@@ -1,6 +1,6 @@
use crate::fmt;
use crate::iter::{adapters::SourceIter, FusedIterator, InPlaceIterable};
use crate::ops::TryWhereOutputEquals;
use crate::ops::Try;
/// An iterator that rejects elements while `predicate` returns `true`.
///
@@ -70,7 +70,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
if !self.flag {
match self.next() {

View File

@@ -1,4 +1,4 @@
use crate::{intrinsics, iter::from_fn, ops::TryWhereOutputEquals};
use crate::{intrinsics, iter::from_fn, ops::Try};
/// An iterator for stepping iterators by a custom amount.
///
@@ -111,7 +111,7 @@ where
fn try_fold<Acc, F, R>(&mut self, mut acc: Acc, mut f: F) -> R
where
F: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
#[inline]
fn nth<I: Iterator>(iter: &mut I, step: usize) -> impl FnMut() -> Option<I::Item> + '_ {
@@ -187,7 +187,7 @@ where
fn try_rfold<Acc, F, R>(&mut self, init: Acc, mut f: F) -> R
where
F: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
#[inline]
fn nth_back<I: DoubleEndedIterator>(

View File

@@ -3,7 +3,7 @@ use crate::iter::{
adapters::zip::try_get_unchecked, adapters::SourceIter, FusedIterator, InPlaceIterable,
TrustedLen, TrustedRandomAccess,
};
use crate::ops::{ControlFlow, TryWhereOutputEquals};
use crate::ops::{ControlFlow, Try};
/// An iterator that only iterates over the first `n` iterations of `iter`.
///
@@ -80,9 +80,9 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
fn check<'a, T, Acc, R: TryWhereOutputEquals<Acc>>(
fn check<'a, T, Acc, R: Try<Output = Acc>>(
n: &'a mut usize,
mut fold: impl FnMut(Acc, T) -> R + 'a,
) -> impl FnMut(Acc, T) -> ControlFlow<R, Acc> + 'a {
@@ -178,7 +178,7 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
if self.n == 0 {
try { init }

View File

@@ -1,6 +1,6 @@
use crate::fmt;
use crate::iter::{adapters::SourceIter, FusedIterator, InPlaceIterable};
use crate::ops::{ControlFlow, TryWhereOutputEquals};
use crate::ops::{ControlFlow, Try};
/// An iterator that only accepts elements while `predicate` returns `true`.
///
@@ -68,9 +68,9 @@ where
where
Self: Sized,
Fold: FnMut(Acc, Self::Item) -> R,
R: TryWhereOutputEquals<Acc>,
R: Try<Output = Acc>,
{
fn check<'a, T, Acc, R: TryWhereOutputEquals<Acc>>(
fn check<'a, T, Acc, R: Try<Output = Acc>>(
flag: &'a mut bool,
p: &'a mut impl FnMut(&T) -> bool,
mut fold: impl FnMut(Acc, T) -> R + 'a,

View File

@@ -1,7 +1,7 @@
use crate::char;
use crate::convert::TryFrom;
use crate::mem;
use crate::ops::{self, TryWhereOutputEquals};
use crate::ops::{self, Try};
use super::{FusedIterator, TrustedLen, TrustedRandomAccess};
@@ -755,7 +755,7 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
where
Self: Sized,
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
if self.is_empty() {
return try { init };
@@ -860,7 +860,7 @@ impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> {
where
Self: Sized,
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
if self.is_empty() {
return try { init };

View File

@@ -1,4 +1,4 @@
use crate::ops::{ControlFlow, TryWhereOutputEquals};
use crate::ops::{ControlFlow, Try};
/// An iterator able to yield elements from both ends.
///
@@ -218,7 +218,7 @@ pub trait DoubleEndedIterator: Iterator {
where
Self: Sized,
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
let mut accum = init;
while let Some(x) = self.next_back() {

View File

@@ -3,7 +3,7 @@
// can't split that into multiple files.
use crate::cmp::{self, Ordering};
use crate::ops::{ControlFlow, TryWhereOutputEquals};
use crate::ops::{ControlFlow, Try};
use super::super::TrustedRandomAccess;
use super::super::{Chain, Cloned, Copied, Cycle, Enumerate, Filter, FilterMap, Fuse};
@@ -1999,7 +1999,7 @@ pub trait Iterator {
where
Self: Sized,
F: FnMut(B, Self::Item) -> R,
R: TryWhereOutputEquals<B>,
R: Try<Output = B>,
{
let mut accum = init;
while let Some(x) = self.next() {
@@ -2041,7 +2041,7 @@ pub trait Iterator {
where
Self: Sized,
F: FnMut(Self::Item) -> R,
R: TryWhereOutputEquals<()>,
R: Try<Output = ()>,
{
#[inline]
fn call<T, R>(mut f: impl FnMut(T) -> R) -> impl FnMut((), T) -> R {
@@ -2417,7 +2417,7 @@ pub trait Iterator {
where
Self: Sized,
F: FnMut(&Self::Item) -> R,
R: TryWhereOutputEquals<bool>,
R: Try<Output = bool>,
// FIXME: This is a weird bound; the API should change
R: crate::ops::TryV2<Residual = Result<crate::convert::Infallible, E>>,
{
@@ -2425,7 +2425,7 @@ pub trait Iterator {
fn check<F, T, R, E>(mut f: F) -> impl FnMut((), T) -> ControlFlow<Result<T, E>>
where
F: FnMut(&T) -> R,
R: TryWhereOutputEquals<bool>,
R: Try<Output = bool>,
R: crate::ops::TryV2<Residual = Result<crate::convert::Infallible, E>>,
{
move |(), x| match f(&x).branch() {
@@ -2446,13 +2446,13 @@ pub trait Iterator {
where
Self: Sized,
F: FnMut(&Self::Item) -> R,
R: TryWhereOutputEquals<bool>,
R: Try<Output = bool>,
{
#[inline]
fn check<F, T, R>(mut f: F) -> impl FnMut((), T) -> ControlFlow<Result<T, R::Error>>
where
F: FnMut(&T) -> R,
R: TryWhereOutputEquals<bool>,
R: Try<Output = bool>,
{
move |(), x| match f(&x).into_result() {
Ok(false) => ControlFlow::CONTINUE,

View File

@@ -64,10 +64,10 @@ pub enum ControlFlow<B, C = ()> {
#[unstable(feature = "control_flow_enum", reason = "new API", issue = "75744")]
impl<B, C> ops::TryV1 for ControlFlow<B, C> {
type Ok = C;
type Output = C;
type Error = B;
#[inline]
fn into_result(self) -> Result<Self::Ok, Self::Error> {
fn into_result(self) -> Result<Self::Output, Self::Error> {
match self {
ControlFlow::Continue(y) => Ok(y),
ControlFlow::Break(x) => Err(x),
@@ -78,7 +78,7 @@ impl<B, C> ops::TryV1 for ControlFlow<B, C> {
ControlFlow::Break(v)
}
#[inline]
fn from_ok(v: Self::Ok) -> Self {
fn from_ok(v: Self::Output) -> Self {
ControlFlow::Continue(v)
}
}
@@ -184,7 +184,7 @@ impl<B, C> ControlFlow<B, C> {
}
#[cfg(bootstrap)]
impl<R: ops::TryV1> ControlFlow<R, R::Ok> {
impl<R: ops::TryV1> ControlFlow<R, R::Output> {
/// Create a `ControlFlow` from any type implementing `Try`.
#[unstable(feature = "control_flow_enum", reason = "new API", issue = "75744")]
#[inline]

View File

@@ -210,24 +210,3 @@ pub use self::unsize::DispatchFromDyn;
#[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<T, C>() where T: TryWhereOutputEquals<C> {}
/// foo::<Option<i32>, i32>();
/// ```
#[unstable(feature = "try_trait_transition", reason = "for bootstrap", issue = "none")]
#[cfg(not(bootstrap))]
pub trait TryWhereOutputEquals<T> = TryV2<Output = T>;
#[unstable(feature = "try_trait_transition", reason = "for bootstrap", issue = "none")]
#[cfg(bootstrap)]
pub trait TryWhereOutputEquals<T> = TryV1<Ok = T>;

View File

@@ -29,7 +29,7 @@
pub trait Try {
/// The type of this value when viewed as successful.
#[unstable(feature = "try_trait", issue = "42327")]
type Ok;
type Output; // This no longer follows its RFC, but is only used in bootstrap.
/// The type of this value when viewed as failed.
#[unstable(feature = "try_trait", issue = "42327")]
type Error;
@@ -45,7 +45,7 @@ pub trait Try {
/// is returned, where `X` is the return type of the enclosing function.
#[cfg_attr(bootstrap, lang = "into_result")]
#[unstable(feature = "try_trait", issue = "42327")]
fn into_result(self) -> Result<Self::Ok, Self::Error>;
fn into_result(self) -> Result<Self::Output, Self::Error>;
/// Wrap an error value to construct the composite result. For example,
/// `Result::Err(x)` and `Result::from_error(x)` are equivalent.
@@ -57,5 +57,5 @@ pub trait Try {
/// `Result::Ok(x)` and `Result::from_ok(x)` are equivalent.
#[cfg_attr(bootstrap, lang = "from_ok")]
#[unstable(feature = "try_trait", issue = "42327")]
fn from_ok(v: Self::Ok) -> Self;
fn from_ok(v: Self::Output) -> Self;
}

View File

@@ -1645,7 +1645,7 @@ pub struct NoneError;
#[unstable(feature = "try_trait", issue = "42327")]
impl<T> ops::TryV1 for Option<T> {
type Ok = T;
type Output = T;
type Error = NoneError;
#[inline]

View File

@@ -1628,7 +1628,7 @@ impl<A, E, V: FromIterator<A>> FromIterator<Result<A, E>> for Result<V, E> {
#[unstable(feature = "try_trait", issue = "42327")]
impl<T, E> ops::TryV1 for Result<T, E> {
type Ok = T;
type Output = T;
type Error = E;
#[inline]

View File

@@ -110,7 +110,7 @@ impl<'a> iter::Iterator for EscapeAscii<'a> {
fn try_fold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R
where
Fold: FnMut(Acc, Self::Item) -> R,
R: ops::TryWhereOutputEquals<Acc>,
R: ops::Try<Output = Acc>,
{
self.inner.try_fold(init, fold)
}

View File

@@ -5,7 +5,7 @@ use crate::fmt::{self, Write};
use crate::iter::TrustedRandomAccess;
use crate::iter::{Chain, FlatMap, Flatten};
use crate::iter::{Copied, Filter, FusedIterator, Map, TrustedLen};
use crate::ops::TryWhereOutputEquals;
use crate::ops::Try;
use crate::option;
use crate::slice::{self, Split as SliceSplit};
@@ -1467,7 +1467,7 @@ macro_rules! escape_types_impls {
#[inline]
fn try_fold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where
Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: TryWhereOutputEquals<Acc>
Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Output = Acc>
{
self.inner.try_fold(init, fold)
}

View File

@@ -130,11 +130,11 @@ impl<T> From<T> for Poll<T> {
#[stable(feature = "futures_api", since = "1.36.0")]
impl<T, E> ops::TryV1 for Poll<Result<T, E>> {
type Ok = Poll<T>;
type Output = Poll<T>;
type Error = E;
#[inline]
fn into_result(self) -> Result<Self::Ok, Self::Error> {
fn into_result(self) -> Result<Self::Output, Self::Error> {
match self {
Poll::Ready(Ok(x)) => Ok(Poll::Ready(x)),
Poll::Ready(Err(e)) => Err(e),
@@ -148,7 +148,7 @@ impl<T, E> ops::TryV1 for Poll<Result<T, E>> {
}
#[inline]
fn from_ok(x: Self::Ok) -> Self {
fn from_ok(x: Self::Output) -> Self {
x.map(Ok)
}
}
@@ -185,11 +185,11 @@ impl<T, E, F: From<E>> ops::FromResidual<Result<convert::Infallible, E>> for Pol
#[stable(feature = "futures_api", since = "1.36.0")]
impl<T, E> ops::TryV1 for Poll<Option<Result<T, E>>> {
type Ok = Poll<Option<T>>;
type Output = Poll<Option<T>>;
type Error = E;
#[inline]
fn into_result(self) -> Result<Self::Ok, Self::Error> {
fn into_result(self) -> Result<Self::Output, Self::Error> {
match self {
Poll::Ready(Some(Ok(x))) => Ok(Poll::Ready(Some(x))),
Poll::Ready(Some(Err(e))) => Err(e),
@@ -204,7 +204,7 @@ impl<T, E> ops::TryV1 for Poll<Option<Result<T, E>>> {
}
#[inline]
fn from_ok(x: Self::Ok) -> Self {
fn from_ok(x: Self::Output) -> Self {
x.map(|x| x.map(Ok))
}
}