Enum wasmtime_wiggle::bitflags::_core::ops::ControlFlow[][src]

pub enum ControlFlow<B, C = ()> {
    Continue(C),
    Break(B),
}
🔬 This is a nightly-only experimental API. (control_flow_enum)

new API

Expand description

Used to tell an operation whether it should exit early or go on as usual.

This is used when exposing things (like graph traversals or visitors) where you want the user to be able to choose whether to exit early. Having the enum makes it clearer – no more wondering “wait, what did false mean again?” – and allows including a value.

Examples

Early-exiting from Iterator::try_for_each:

#![feature(control_flow_enum)]
use std::ops::ControlFlow;

let r = (2..100).try_for_each(|x| {
    if 403 % x == 0 {
        return ControlFlow::Break(x)
    }

    ControlFlow::Continue(())
});
assert_eq!(r, ControlFlow::Break(13));

A basic tree traversal:

#![feature(control_flow_enum)]
use std::ops::ControlFlow;

pub struct TreeNode<T> {
    value: T,
    left: Option<Box<TreeNode<T>>>,
    right: Option<Box<TreeNode<T>>>,
}

impl<T> TreeNode<T> {
    pub fn traverse_inorder<B>(&self, mut f: impl FnMut(&T) -> ControlFlow<B>) -> ControlFlow<B> {
        if let Some(left) = &self.left {
            left.traverse_inorder(&mut f)?;
        }
        f(&self.value)?;
        if let Some(right) = &self.right {
            right.traverse_inorder(&mut f)?;
        }
        ControlFlow::Continue(())
    }
}

Variants

Continue(C)
🔬 This is a nightly-only experimental API. (control_flow_enum)

new API

Move on to the next phase of the operation as normal.

Break(B)
🔬 This is a nightly-only experimental API. (control_flow_enum)

new API

Exit the operation without running subsequent phases.

Implementations

impl<B, C> ControlFlow<B, C>[src]

pub fn is_break(&self) -> bool[src]

🔬 This is a nightly-only experimental API. (control_flow_enum)

new API

Returns true if this is a Break variant.

Examples

#![feature(control_flow_enum)]
use std::ops::ControlFlow;

assert!(ControlFlow::<i32, String>::Break(3).is_break());
assert!(!ControlFlow::<String, i32>::Continue(3).is_break());

pub fn is_continue(&self) -> bool[src]

🔬 This is a nightly-only experimental API. (control_flow_enum)

new API

Returns true if this is a Continue variant.

Examples

#![feature(control_flow_enum)]
use std::ops::ControlFlow;

assert!(!ControlFlow::<i32, String>::Break(3).is_continue());
assert!(ControlFlow::<String, i32>::Continue(3).is_continue());

pub fn break_value(self) -> Option<B>[src]

🔬 This is a nightly-only experimental API. (control_flow_enum)

new API

Converts the ControlFlow into an Option which is Some if the ControlFlow was Break and None otherwise.

Examples

#![feature(control_flow_enum)]
use std::ops::ControlFlow;

assert_eq!(ControlFlow::<i32, String>::Break(3).break_value(), Some(3));
assert_eq!(ControlFlow::<String, i32>::Continue(3).break_value(), None);

pub fn map_break<T, F>(self, f: F) -> ControlFlow<T, C> where
    F: FnOnce(B) -> T, 
[src]

🔬 This is a nightly-only experimental API. (control_flow_enum)

new API

Maps ControlFlow<B, C> to ControlFlow<T, C> by applying a function to the break value in case it exists.

impl<R> ControlFlow<R, <R as Try>::Output> where
    R: Try
[src]

pub fn from_try(r: R) -> ControlFlow<R, <R as Try>::Output>[src]

🔬 This is a nightly-only experimental API. (control_flow_enum)

new API

Create a ControlFlow from any type implementing Try.

pub fn into_try(self) -> R[src]

🔬 This is a nightly-only experimental API. (control_flow_enum)

new API

Convert a ControlFlow into any type implementing Try;

impl<B> ControlFlow<B, ()>[src]

pub const CONTINUE: ControlFlow<B, ()>[src]

🔬 This is a nightly-only experimental API. (control_flow_enum)

new API

It’s frequently the case that there’s no value needed with Continue, so this provides a way to avoid typing (()), if you prefer it.

Examples

#![feature(control_flow_enum)]
use std::ops::ControlFlow;

let mut partial_sum = 0;
let last_used = (1..10).chain(20..25).try_for_each(|x| {
    partial_sum += x;
    if partial_sum > 100 { ControlFlow::Break(x) }
    else { ControlFlow::CONTINUE }
});
assert_eq!(last_used.break_value(), Some(22));

impl<C> ControlFlow<(), C>[src]

pub const BREAK: ControlFlow<(), C>[src]

🔬 This is a nightly-only experimental API. (control_flow_enum)

new API

APIs like try_for_each don’t need values with Break, so this provides a way to avoid typing (()), if you prefer it.

Examples

#![feature(control_flow_enum)]
use std::ops::ControlFlow;

let mut partial_sum = 0;
(1..10).chain(20..25).try_for_each(|x| {
    if partial_sum > 100 { ControlFlow::BREAK }
    else { partial_sum += x; ControlFlow::CONTINUE }
});
assert_eq!(partial_sum, 108);

Trait Implementations

impl<B, C> Clone for ControlFlow<B, C> where
    C: Clone,
    B: Clone
[src]

pub fn clone(&self) -> ControlFlow<B, C>[src]

Returns a copy of the value. Read more

fn clone_from(&mut self, source: &Self)1.0.0[src]

Performs copy-assignment from source. Read more

impl<B, C> Debug for ControlFlow<B, C> where
    C: Debug,
    B: Debug
[src]

pub fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>[src]

Formats the value using the given formatter. Read more

impl<B, C> FromResidual<<ControlFlow<B, C> as Try>::Residual> for ControlFlow<B, C>[src]

pub fn from_residual(residual: ControlFlow<B, Infallible>) -> ControlFlow<B, C>[src]

🔬 This is a nightly-only experimental API. (try_trait_v2)

Constructs the type from a compatible Residual type. Read more

impl<B, C> PartialEq<ControlFlow<B, C>> for ControlFlow<B, C> where
    C: PartialEq<C>,
    B: PartialEq<B>, 
[src]

pub fn eq(&self, other: &ControlFlow<B, C>) -> bool[src]

This method tests for self and other values to be equal, and is used by ==. Read more

pub fn ne(&self, other: &ControlFlow<B, C>) -> bool[src]

This method tests for !=.

impl<B, C> Try for ControlFlow<B, C>[src]

type Output = C

🔬 This is a nightly-only experimental API. (try_trait_v2)

The type of the value produced by ? when not short-circuiting.

type Residual = ControlFlow<B, Infallible>

🔬 This is a nightly-only experimental API. (try_trait_v2)

The type of the value passed to FromResidual::from_residual as part of ? when short-circuiting. Read more

pub fn from_output(
    output: <ControlFlow<B, C> as Try>::Output
) -> ControlFlow<B, C>
[src]

🔬 This is a nightly-only experimental API. (try_trait_v2)

Constructs the type from its Output type. Read more

pub fn branch(
    self
) -> ControlFlow<<ControlFlow<B, C> as Try>::Residual, <ControlFlow<B, C> as Try>::Output>
[src]

🔬 This is a nightly-only experimental API. (try_trait_v2)

Used in ? to decide whether the operator should produce a value (because this returned ControlFlow::Continue) or propagate a value back to the caller (because this returned ControlFlow::Break). Read more

impl<B, C> Copy for ControlFlow<B, C> where
    C: Copy,
    B: Copy
[src]

impl<B, C> StructuralPartialEq for ControlFlow<B, C>[src]

Auto Trait Implementations

impl<B, C> RefUnwindSafe for ControlFlow<B, C> where
    B: RefUnwindSafe,
    C: RefUnwindSafe

impl<B, C> Send for ControlFlow<B, C> where
    B: Send,
    C: Send

impl<B, C> Sync for ControlFlow<B, C> where
    B: Sync,
    C: Sync

impl<B, C> Unpin for ControlFlow<B, C> where
    B: Unpin,
    C: Unpin

impl<B, C> UnwindSafe for ControlFlow<B, C> where
    B: UnwindSafe,
    C: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

pub fn type_id(&self) -> TypeId[src]

Gets the TypeId of self. Read more

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

pub fn borrow(&self) -> &T[src]

Immutably borrows from an owned value. Read more

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

pub fn borrow_mut(&mut self) -> &mut T[src]

Mutably borrows from an owned value. Read more

impl<T> From<T> for T[src]

pub fn from(t: T) -> T[src]

Performs the conversion.

impl<T> Instrument for T[src]

fn instrument(self, span: Span) -> Instrumented<Self>

Notable traits for Instrumented<T>

impl<T> Future for Instrumented<T> where
    T: Future
type Output = <T as Future>::Output;
[src]

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

fn in_current_span(self) -> Instrumented<Self>

Notable traits for Instrumented<T>

impl<T> Future for Instrumented<T> where
    T: Future
type Output = <T as Future>::Output;
[src]

Instruments this type with the current Span, returning an Instrumented wrapper. Read more

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

pub fn into(self) -> U[src]

Performs the conversion.

impl<T> Pointee for T[src]

type Pointer = u32

pub fn debug(
    pointer: <T as Pointee>::Pointer,
    f: &mut Formatter<'_>
) -> Result<(), Error>
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

pub fn to_owned(&self) -> T[src]

Creates owned data from borrowed data, usually by cloning. Read more

pub fn clone_into(&self, target: &mut T)[src]

🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

Uses borrowed data to replace owned data, usually by cloning. Read more

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]

Performs the conversion.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>[src]

Performs the conversion.

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

pub fn vzip(self) -> V