Constifed Try trait
This commit is contained in:
parent
0b2f717dfa
commit
8e0ea60a04
@ -1,4 +1,5 @@
|
|||||||
use crate::array;
|
use crate::array;
|
||||||
|
use crate::const_closure::ConstFnMutClosure;
|
||||||
use crate::iter::{ByRefSized, FusedIterator, Iterator};
|
use crate::iter::{ByRefSized, FusedIterator, Iterator};
|
||||||
use crate::ops::{ControlFlow, NeverShortCircuit, Try};
|
use crate::ops::{ControlFlow, NeverShortCircuit, Try};
|
||||||
|
|
||||||
@ -82,12 +83,12 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fold<B, F>(mut self, init: B, f: F) -> B
|
fn fold<B, F>(mut self, init: B, mut f: F) -> B
|
||||||
where
|
where
|
||||||
Self: Sized,
|
Self: Sized,
|
||||||
F: FnMut(B, Self::Item) -> B,
|
F: FnMut(B, Self::Item) -> B,
|
||||||
{
|
{
|
||||||
self.try_fold(init, NeverShortCircuit::wrap_mut_2(f)).0
|
self.try_fold(init, ConstFnMutClosure::new(&mut f, NeverShortCircuit::wrap_mut_2_imp)).0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,12 +127,12 @@ where
|
|||||||
try { acc }
|
try { acc }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rfold<B, F>(mut self, init: B, f: F) -> B
|
fn rfold<B, F>(mut self, init: B, mut f: F) -> B
|
||||||
where
|
where
|
||||||
Self: Sized,
|
Self: Sized,
|
||||||
F: FnMut(B, Self::Item) -> B,
|
F: FnMut(B, Self::Item) -> B,
|
||||||
{
|
{
|
||||||
self.try_rfold(init, NeverShortCircuit::wrap_mut_2(f)).0
|
self.try_rfold(init, ConstFnMutClosure::new(&mut f, NeverShortCircuit::wrap_mut_2_imp)).0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
use crate::ops::{NeverShortCircuit, Try};
|
use crate::{
|
||||||
|
const_closure::ConstFnMutClosure,
|
||||||
|
ops::{NeverShortCircuit, Try},
|
||||||
|
};
|
||||||
|
|
||||||
/// Like `Iterator::by_ref`, but requiring `Sized` so it can forward generics.
|
/// Like `Iterator::by_ref`, but requiring `Sized` so it can forward generics.
|
||||||
///
|
///
|
||||||
@ -36,12 +39,13 @@ impl<I: Iterator> Iterator for ByRefSized<'_, I> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn fold<B, F>(self, init: B, f: F) -> B
|
fn fold<B, F>(self, init: B, mut f: F) -> B
|
||||||
where
|
where
|
||||||
F: FnMut(B, Self::Item) -> B,
|
F: FnMut(B, Self::Item) -> B,
|
||||||
{
|
{
|
||||||
// `fold` needs ownership, so this can't forward directly.
|
// `fold` needs ownership, so this can't forward directly.
|
||||||
I::try_fold(self.0, init, NeverShortCircuit::wrap_mut_2(f)).0
|
I::try_fold(self.0, init, ConstFnMutClosure::new(&mut f, NeverShortCircuit::wrap_mut_2_imp))
|
||||||
|
.0
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@ -72,12 +76,17 @@ impl<I: DoubleEndedIterator> DoubleEndedIterator for ByRefSized<'_, I> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn rfold<B, F>(self, init: B, f: F) -> B
|
fn rfold<B, F>(self, init: B, mut f: F) -> B
|
||||||
where
|
where
|
||||||
F: FnMut(B, Self::Item) -> B,
|
F: FnMut(B, Self::Item) -> B,
|
||||||
{
|
{
|
||||||
// `rfold` needs ownership, so this can't forward directly.
|
// `rfold` needs ownership, so this can't forward directly.
|
||||||
I::try_rfold(self.0, init, NeverShortCircuit::wrap_mut_2(f)).0
|
I::try_rfold(
|
||||||
|
self.0,
|
||||||
|
init,
|
||||||
|
ConstFnMutClosure::new(&mut f, NeverShortCircuit::wrap_mut_2_imp),
|
||||||
|
)
|
||||||
|
.0
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
use crate::const_closure::ConstFnMutClosure;
|
||||||
use crate::iter::{InPlaceIterable, Iterator};
|
use crate::iter::{InPlaceIterable, Iterator};
|
||||||
use crate::ops::{ChangeOutputType, ControlFlow, FromResidual, NeverShortCircuit, Residual, Try};
|
use crate::ops::{ChangeOutputType, ControlFlow, FromResidual, NeverShortCircuit, Residual, Try};
|
||||||
|
|
||||||
@ -203,12 +204,12 @@ where
|
|||||||
.into_try()
|
.into_try()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fold<B, F>(mut self, init: B, fold: F) -> B
|
fn fold<B, F>(mut self, init: B, mut fold: F) -> B
|
||||||
where
|
where
|
||||||
Self: Sized,
|
Self: Sized,
|
||||||
F: FnMut(B, Self::Item) -> B,
|
F: FnMut(B, Self::Item) -> B,
|
||||||
{
|
{
|
||||||
self.try_fold(init, NeverShortCircuit::wrap_mut_2(fold)).0
|
self.try_fold(init, ConstFnMutClosure::new(&mut fold, NeverShortCircuit::wrap_mut_2_imp)).0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,7 +126,7 @@ impl<B, C> const ops::FromResidual for ControlFlow<B, C> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[unstable(feature = "try_trait_v2_residual", issue = "91285")]
|
#[unstable(feature = "try_trait_v2_residual", issue = "91285")]
|
||||||
impl<B, C> ops::Residual<C> for ControlFlow<B, convert::Infallible> {
|
impl<B, C> const ops::Residual<C> for ControlFlow<B, convert::Infallible> {
|
||||||
type TryType = ControlFlow<B, C>;
|
type TryType = ControlFlow<B, C>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,7 +129,7 @@ use crate::ops::ControlFlow;
|
|||||||
#[doc(alias = "?")]
|
#[doc(alias = "?")]
|
||||||
#[lang = "Try"]
|
#[lang = "Try"]
|
||||||
#[const_trait]
|
#[const_trait]
|
||||||
pub trait Try: FromResidual {
|
pub trait Try: ~const FromResidual {
|
||||||
/// The type of the value produced by `?` when *not* short-circuiting.
|
/// The type of the value produced by `?` when *not* short-circuiting.
|
||||||
#[unstable(feature = "try_trait_v2", issue = "84277")]
|
#[unstable(feature = "try_trait_v2", issue = "84277")]
|
||||||
type Output;
|
type Output;
|
||||||
@ -438,10 +438,11 @@ where
|
|||||||
/// and in the other direction,
|
/// and in the other direction,
|
||||||
/// `<Result<Infallible, E> as Residual<T>>::TryType = Result<T, E>`.
|
/// `<Result<Infallible, E> as Residual<T>>::TryType = Result<T, E>`.
|
||||||
#[unstable(feature = "try_trait_v2_residual", issue = "91285")]
|
#[unstable(feature = "try_trait_v2_residual", issue = "91285")]
|
||||||
|
#[const_trait]
|
||||||
pub trait Residual<O> {
|
pub trait Residual<O> {
|
||||||
/// The "return" type of this meta-function.
|
/// The "return" type of this meta-function.
|
||||||
#[unstable(feature = "try_trait_v2_residual", issue = "91285")]
|
#[unstable(feature = "try_trait_v2_residual", issue = "91285")]
|
||||||
type TryType: Try<Output = O, Residual = Self>;
|
type TryType: ~const Try<Output = O, Residual = Self>;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[unstable(feature = "pub_crate_should_not_need_unstable_attr", issue = "none")]
|
#[unstable(feature = "pub_crate_should_not_need_unstable_attr", issue = "none")]
|
||||||
@ -460,14 +461,17 @@ pub(crate) struct NeverShortCircuit<T>(pub T);
|
|||||||
impl<T> NeverShortCircuit<T> {
|
impl<T> NeverShortCircuit<T> {
|
||||||
/// Wrap a binary `FnMut` to return its result wrapped in a `NeverShortCircuit`.
|
/// Wrap a binary `FnMut` to return its result wrapped in a `NeverShortCircuit`.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn wrap_mut_2<A, B>(mut f: impl FnMut(A, B) -> T) -> impl FnMut(A, B) -> Self {
|
pub const fn wrap_mut_2_imp<A, B, F: ~const FnMut(A, B) -> T>(
|
||||||
move |a, b| NeverShortCircuit(f(a, b))
|
f: &mut F,
|
||||||
|
(a, b): (A, B),
|
||||||
|
) -> NeverShortCircuit<T> {
|
||||||
|
NeverShortCircuit(f(a, b))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) enum NeverShortCircuitResidual {}
|
pub(crate) enum NeverShortCircuitResidual {}
|
||||||
|
|
||||||
impl<T> Try for NeverShortCircuit<T> {
|
impl<T> const Try for NeverShortCircuit<T> {
|
||||||
type Output = T;
|
type Output = T;
|
||||||
type Residual = NeverShortCircuitResidual;
|
type Residual = NeverShortCircuitResidual;
|
||||||
|
|
||||||
@ -482,14 +486,14 @@ impl<T> Try for NeverShortCircuit<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> FromResidual for NeverShortCircuit<T> {
|
impl<T> const FromResidual for NeverShortCircuit<T> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn from_residual(never: NeverShortCircuitResidual) -> Self {
|
fn from_residual(never: NeverShortCircuitResidual) -> Self {
|
||||||
match never {}
|
match never {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Residual<T> for NeverShortCircuitResidual {
|
impl<T> const Residual<T> for NeverShortCircuitResidual {
|
||||||
type TryType = NeverShortCircuit<T>;
|
type TryType = NeverShortCircuit<T>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user