Use try{} in try_fold to decouple library from Try details

This commit is contained in:
Scott McMurray 2020-09-03 17:11:02 -07:00
parent 8dae8cdcc8
commit 5573a16353
8 changed files with 31 additions and 30 deletions

View File

@ -109,7 +109,7 @@ where
acc = b.try_fold(acc, f)?; acc = b.try_fold(acc, f)?;
// we don't fuse the second iterator // we don't fuse the second iterator
} }
Try::from_ok(acc) try { acc }
} }
fn fold<Acc, F>(self, mut acc: Acc, mut f: F) -> Acc fn fold<Acc, F>(self, mut acc: Acc, mut f: F) -> Acc
@ -292,7 +292,7 @@ where
acc = a.try_rfold(acc, f)?; acc = a.try_rfold(acc, f)?;
// we don't fuse the second iterator // we don't fuse the second iterator
} }
Try::from_ok(acc) try { acc }
} }
fn rfold<Acc, F>(self, mut acc: Acc, mut f: F) -> Acc fn rfold<Acc, F>(self, mut acc: Acc, mut f: F) -> Acc

View File

@ -317,7 +317,7 @@ where
} }
self.backiter = None; self.backiter = None;
Try::from_ok(init) try { init }
} }
#[inline] #[inline]
@ -397,7 +397,7 @@ where
} }
self.frontiter = None; self.frontiter = None;
Try::from_ok(init) try { init }
} }
#[inline] #[inline]

View File

@ -303,7 +303,7 @@ where
acc = iter.try_fold(acc, fold)?; acc = iter.try_fold(acc, fold)?;
self.iter = None; self.iter = None;
} }
Try::from_ok(acc) try { acc }
} }
#[inline] #[inline]
@ -353,7 +353,7 @@ where
acc = iter.try_rfold(acc, fold)?; acc = iter.try_rfold(acc, fold)?;
self.iter = None; self.iter = None;
} }
Try::from_ok(acc) try { acc }
} }
#[inline] #[inline]

View File

@ -579,7 +579,7 @@ where
})?; })?;
if is_empty { if is_empty {
return Try::from_ok(acc); return try { acc };
} }
loop { loop {
@ -715,7 +715,7 @@ where
if self.first_take { if self.first_take {
self.first_take = false; self.first_take = false;
match self.iter.next() { match self.iter.next() {
None => return Try::from_ok(acc), None => return try { acc },
Some(x) => acc = f(acc, x)?, Some(x) => acc = f(acc, x)?,
} }
} }
@ -792,7 +792,7 @@ where
} }
match self.next_back() { match self.next_back() {
None => Try::from_ok(init), None => try { init },
Some(x) => { Some(x) => {
let acc = f(init, x)?; let acc = f(init, x)?;
from_fn(nth_back(&mut self.iter, self.step)).try_fold(acc, f) from_fn(nth_back(&mut self.iter, self.step)).try_fold(acc, f)
@ -1075,7 +1075,7 @@ fn filter_try_fold<'a, T, Acc, R: Try<Ok = Acc>>(
predicate: &'a mut impl FnMut(&T) -> bool, predicate: &'a mut impl FnMut(&T) -> bool,
mut fold: impl FnMut(Acc, T) -> R + 'a, mut fold: impl FnMut(Acc, T) -> R + 'a,
) -> impl FnMut(Acc, T) -> R + 'a { ) -> impl FnMut(Acc, T) -> R + 'a {
move |acc, item| if predicate(&item) { fold(acc, item) } else { R::from_ok(acc) } move |acc, item| if predicate(&item) { fold(acc, item) } else { try { acc } }
} }
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
@ -1229,7 +1229,7 @@ fn filter_map_try_fold<'a, T, B, Acc, R: Try<Ok = Acc>>(
) -> impl FnMut(Acc, T) -> R + 'a { ) -> impl FnMut(Acc, T) -> R + 'a {
move |acc, item| match f(item) { move |acc, item| match f(item) {
Some(x) => fold(acc, x), Some(x) => fold(acc, x),
None => R::from_ok(acc), None => try { acc },
} }
} }
@ -1660,7 +1660,7 @@ impl<I: Iterator> Iterator for Peekable<I> {
R: Try<Ok = B>, R: Try<Ok = B>,
{ {
let acc = match self.peeked.take() { let acc = match self.peeked.take() {
Some(None) => return Try::from_ok(init), Some(None) => return try { init },
Some(Some(v)) => f(init, v)?, Some(Some(v)) => f(init, v)?,
None => init, None => init,
}; };
@ -1703,7 +1703,7 @@ where
R: Try<Ok = B>, R: Try<Ok = B>,
{ {
match self.peeked.take() { match self.peeked.take() {
Some(None) => Try::from_ok(init), Some(None) => try { init },
Some(Some(v)) => match self.iter.try_rfold(init, &mut f).into_result() { Some(Some(v)) => match self.iter.try_rfold(init, &mut f).into_result() {
Ok(acc) => f(acc, v), Ok(acc) => f(acc, v),
Err(e) => { Err(e) => {
@ -1938,7 +1938,7 @@ where
if !self.flag { if !self.flag {
match self.next() { match self.next() {
Some(v) => init = fold(init, v)?, Some(v) => init = fold(init, v)?,
None => return Try::from_ok(init), None => return try { init },
} }
} }
self.iter.try_fold(init, fold) self.iter.try_fold(init, fold)
@ -2065,13 +2065,13 @@ where
ControlFlow::from_try(fold(acc, x)) ControlFlow::from_try(fold(acc, x))
} else { } else {
*flag = true; *flag = true;
ControlFlow::Break(Try::from_ok(acc)) ControlFlow::Break(try { acc })
} }
} }
} }
if self.flag { if self.flag {
Try::from_ok(init) try { init }
} else { } else {
let flag = &mut self.flag; let flag = &mut self.flag;
let p = &mut self.predicate; let p = &mut self.predicate;
@ -2180,7 +2180,7 @@ where
let Self { iter, predicate } = self; let Self { iter, predicate } = self;
iter.try_fold(init, |acc, x| match predicate(x) { iter.try_fold(init, |acc, x| match predicate(x) {
Some(item) => ControlFlow::from_try(fold(acc, item)), Some(item) => ControlFlow::from_try(fold(acc, item)),
None => ControlFlow::Break(Try::from_ok(acc)), None => ControlFlow::Break(try { acc }),
}) })
.into_try() .into_try()
} }
@ -2316,7 +2316,7 @@ where
if n > 0 { if n > 0 {
// nth(n) skips n+1 // nth(n) skips n+1
if self.iter.nth(n - 1).is_none() { if self.iter.nth(n - 1).is_none() {
return Try::from_ok(init); return try { init };
} }
} }
self.iter.try_fold(init, fold) self.iter.try_fold(init, fold)
@ -2382,7 +2382,7 @@ where
let n = self.len(); let n = self.len();
if n == 0 { if n == 0 {
Try::from_ok(init) try { init }
} else { } else {
self.iter.try_rfold(init, check(n, fold)).into_try() self.iter.try_rfold(init, check(n, fold)).into_try()
} }
@ -2509,7 +2509,7 @@ where
} }
if self.n == 0 { if self.n == 0 {
Try::from_ok(init) try { init }
} else { } else {
let n = &mut self.n; let n = &mut self.n;
self.iter.try_fold(init, check(n, fold)).into_try() self.iter.try_fold(init, check(n, fold)).into_try()
@ -2587,11 +2587,11 @@ where
R: Try<Ok = Acc>, R: Try<Ok = Acc>,
{ {
if self.n == 0 { if self.n == 0 {
Try::from_ok(init) try { init }
} else { } else {
let len = self.iter.len(); let len = self.iter.len();
if len > self.n && self.iter.nth_back(len - self.n - 1).is_none() { if len > self.n && self.iter.nth_back(len - self.n - 1).is_none() {
Try::from_ok(init) try { init }
} else { } else {
self.iter.try_rfold(init, fold) self.iter.try_rfold(init, fold)
} }
@ -2687,7 +2687,7 @@ where
mut fold: impl FnMut(Acc, B) -> R + 'a, mut fold: impl FnMut(Acc, B) -> R + 'a,
) -> impl FnMut(Acc, T) -> ControlFlow<Acc, R> + 'a { ) -> impl FnMut(Acc, T) -> ControlFlow<Acc, R> + 'a {
move |acc, x| match f(state, x) { move |acc, x| match f(state, x) {
None => ControlFlow::Break(Try::from_ok(acc)), None => ControlFlow::Break(try { acc }),
Some(x) => ControlFlow::from_try(fold(acc, x)), Some(x) => ControlFlow::from_try(fold(acc, x)),
} }
} }
@ -2951,7 +2951,7 @@ where
Ok(x) => ControlFlow::from_try(f(acc, x)), Ok(x) => ControlFlow::from_try(f(acc, x)),
Err(e) => { Err(e) => {
*error = Err(e); *error = Err(e);
ControlFlow::Break(Try::from_ok(acc)) ControlFlow::Break(try { acc })
} }
}) })
.into_try() .into_try()

View File

@ -713,7 +713,7 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
R: Try<Ok = B>, R: Try<Ok = B>,
{ {
if self.is_empty() { if self.is_empty() {
return Try::from_ok(init); return try { init };
} }
let mut accum = init; let mut accum = init;
@ -731,7 +731,7 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
accum = f(accum, self.start.clone())?; accum = f(accum, self.start.clone())?;
} }
Try::from_ok(accum) try { accum }
} }
#[inline] #[inline]
@ -818,7 +818,7 @@ impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> {
R: Try<Ok = B>, R: Try<Ok = B>,
{ {
if self.is_empty() { if self.is_empty() {
return Try::from_ok(init); return try { init };
} }
let mut accum = init; let mut accum = init;
@ -836,7 +836,7 @@ impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> {
accum = f(accum, self.start.clone())?; accum = f(accum, self.start.clone())?;
} }
Try::from_ok(accum) try { accum }
} }
#[inline] #[inline]

View File

@ -221,7 +221,7 @@ pub trait DoubleEndedIterator: Iterator {
while let Some(x) = self.next_back() { while let Some(x) = self.next_back() {
accum = f(accum, x)?; accum = f(accum, x)?;
} }
Try::from_ok(accum) try { accum }
} }
/// An iterator method that reduces the iterator's elements to a single, /// An iterator method that reduces the iterator's elements to a single,

View File

@ -1887,7 +1887,7 @@ pub trait Iterator {
while let Some(x) = self.next() { while let Some(x) = self.next() {
accum = f(accum, x)?; accum = f(accum, x)?;
} }
Try::from_ok(accum) try { accum }
} }
/// An iterator method that applies a fallible function to each item in the /// An iterator method that applies a fallible function to each item in the

View File

@ -127,6 +127,7 @@
#![feature(std_internals)] #![feature(std_internals)]
#![feature(stmt_expr_attributes)] #![feature(stmt_expr_attributes)]
#![feature(transparent_unions)] #![feature(transparent_unions)]
#![feature(try_blocks)]
#![feature(unboxed_closures)] #![feature(unboxed_closures)]
#![feature(unsized_locals)] #![feature(unsized_locals)]
#![feature(untagged_unions)] #![feature(untagged_unions)]