Skip to main content

ViewSeq

Trait ViewSeq 

Source
pub trait ViewSeq<State, M>
where State: 'static,
{ // Required method fn extend_views(self, out: &mut Vec<AnyView<State>>); }
Expand description

A child sequence: what a container’s child-list parameter accepts, so app code passes heterogeneous children without writing any at the call site.

A container takes children: impl ViewSeq<State, M> (generic over the inference marker M, which callers never name) and calls ViewSeq::extend_views once to push every element into the erased child vector it already stores (Vec<AnyView<State>>). That push is the one place erasure happens: each element goes through AnyView::new, which is idempotent, so an element that is already an AnyView is moved in as-is — never boxed twice — and no intermediate collection is built.

Implemented for:

  • any single View (one element; AnyView included),
  • tuples (S1, .., Sn) for n = 1..=12, where every element is itself a ViewSeq, so elements of different concrete types mix freely and tuples nest — a nested tuple flattens in order,
  • Vec<S> and [S; N] (homogeneous; the element is any ViewSeq),
  • Option<S> (None contributes no element — see below),
  • views(iter) for any iterator of views (there is deliberately no blanket impl over IntoIterator: it would overlap the tuple impls).

Identity is positional. The reconciler matches children by position (plus the concrete element type), so a tuple’s elements keep their identity only while their positions do. An Option that is None contributes nothing, so every later sibling moves up one slot when it flips — exactly like a conditional child added through a builder’s .when_some(..)/.when(..). Put optional children last, or use the container’s keyed-child API (still a Vec-based affair, not a tuple one) when sibling identity must survive.

Arity. A single tuple holds at most 12 elements; beyond that, nest tuples (((a, b, .., l), (m, n))), which flattens to the same order.

The marker parameter. M exists only so the single-view impl (impl<V: View<State>> ViewSeq<State, _> for V) can coexist with the container impls — without it the compiler must assume some downstream crate could implement View for a Vec or a tuple and rejects the overlap. Each impl picks a distinct marker from seq_marker, so inference always resolves it; a function accepting a sequence just declares a generic M.

use frust_core::{AnyView, ViewSeq};

// A container-style API: generic over the marker, erasing into one Vec.
fn children<M>(seq: impl ViewSeq<(), M>) -> Vec<AnyView<()>> {
    let mut out = Vec::new();
    seq.extend_views(&mut out);
    out
}

let none = || None::<AnyView<()>>;
let empty = Vec::<AnyView<()>>::new;
// Twelve elements is the widest flat tuple.
let twelve = (
    none(), none(), none(), none(), none(), none(),
    none(), none(), none(), none(), none(), empty(),
);
assert!(children(twelve).is_empty());

A thirteenth flat element is not a sequence — nest instead:

ⓘ
use frust_core::{AnyView, ViewSeq};

fn children<M>(seq: impl ViewSeq<(), M>) -> Vec<AnyView<()>> {
    let mut out = Vec::new();
    seq.extend_views(&mut out);
    out
}

let none = || None::<AnyView<()>>;
let thirteen = (
    none(), none(), none(), none(), none(), none(), none(),
    none(), none(), none(), none(), none(), none(),
);
let _ = children(thirteen);

Required Methods§

Source

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Push every element of this sequence, in order, onto out — erasing each with AnyView::new (a no-op for an element already an AnyView).

Dyn Compatibility§

This trait is dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementations on Foreign Types§

Source§

impl<State, M0, S0, M1, S1, M2, S2, M3, S3, M4, S4, M5, S5, M6, S6, M7, S7, M8, S8, M9, S9, M10, S10, M11, S11> ViewSeq<State, (M0, M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11)> for (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)
where State: 'static, S0: ViewSeq<State, M0>, S1: ViewSeq<State, M1>, S2: ViewSeq<State, M2>, S3: ViewSeq<State, M3>, S4: ViewSeq<State, M4>, S5: ViewSeq<State, M5>, S6: ViewSeq<State, M6>, S7: ViewSeq<State, M7>, S8: ViewSeq<State, M8>, S9: ViewSeq<State, M9>, S10: ViewSeq<State, M10>, S11: ViewSeq<State, M11>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Source§

impl<State, M0, S0, M1, S1, M2, S2, M3, S3, M4, S4, M5, S5, M6, S6, M7, S7, M8, S8, M9, S9, M10, S10> ViewSeq<State, (M0, M1, M2, M3, M4, M5, M6, M7, M8, M9, M10)> for (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)
where State: 'static, S0: ViewSeq<State, M0>, S1: ViewSeq<State, M1>, S2: ViewSeq<State, M2>, S3: ViewSeq<State, M3>, S4: ViewSeq<State, M4>, S5: ViewSeq<State, M5>, S6: ViewSeq<State, M6>, S7: ViewSeq<State, M7>, S8: ViewSeq<State, M8>, S9: ViewSeq<State, M9>, S10: ViewSeq<State, M10>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Source§

impl<State, M0, S0, M1, S1, M2, S2, M3, S3, M4, S4, M5, S5, M6, S6, M7, S7, M8, S8, M9, S9> ViewSeq<State, (M0, M1, M2, M3, M4, M5, M6, M7, M8, M9)> for (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)
where State: 'static, S0: ViewSeq<State, M0>, S1: ViewSeq<State, M1>, S2: ViewSeq<State, M2>, S3: ViewSeq<State, M3>, S4: ViewSeq<State, M4>, S5: ViewSeq<State, M5>, S6: ViewSeq<State, M6>, S7: ViewSeq<State, M7>, S8: ViewSeq<State, M8>, S9: ViewSeq<State, M9>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Source§

impl<State, M0, S0, M1, S1, M2, S2, M3, S3, M4, S4, M5, S5, M6, S6, M7, S7, M8, S8> ViewSeq<State, (M0, M1, M2, M3, M4, M5, M6, M7, M8)> for (S0, S1, S2, S3, S4, S5, S6, S7, S8)
where State: 'static, S0: ViewSeq<State, M0>, S1: ViewSeq<State, M1>, S2: ViewSeq<State, M2>, S3: ViewSeq<State, M3>, S4: ViewSeq<State, M4>, S5: ViewSeq<State, M5>, S6: ViewSeq<State, M6>, S7: ViewSeq<State, M7>, S8: ViewSeq<State, M8>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Source§

impl<State, M0, S0, M1, S1, M2, S2, M3, S3, M4, S4, M5, S5, M6, S6, M7, S7> ViewSeq<State, (M0, M1, M2, M3, M4, M5, M6, M7)> for (S0, S1, S2, S3, S4, S5, S6, S7)
where State: 'static, S0: ViewSeq<State, M0>, S1: ViewSeq<State, M1>, S2: ViewSeq<State, M2>, S3: ViewSeq<State, M3>, S4: ViewSeq<State, M4>, S5: ViewSeq<State, M5>, S6: ViewSeq<State, M6>, S7: ViewSeq<State, M7>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Source§

impl<State, M0, S0, M1, S1, M2, S2, M3, S3, M4, S4, M5, S5, M6, S6> ViewSeq<State, (M0, M1, M2, M3, M4, M5, M6)> for (S0, S1, S2, S3, S4, S5, S6)
where State: 'static, S0: ViewSeq<State, M0>, S1: ViewSeq<State, M1>, S2: ViewSeq<State, M2>, S3: ViewSeq<State, M3>, S4: ViewSeq<State, M4>, S5: ViewSeq<State, M5>, S6: ViewSeq<State, M6>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Source§

impl<State, M0, S0, M1, S1, M2, S2, M3, S3, M4, S4, M5, S5> ViewSeq<State, (M0, M1, M2, M3, M4, M5)> for (S0, S1, S2, S3, S4, S5)
where State: 'static, S0: ViewSeq<State, M0>, S1: ViewSeq<State, M1>, S2: ViewSeq<State, M2>, S3: ViewSeq<State, M3>, S4: ViewSeq<State, M4>, S5: ViewSeq<State, M5>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Source§

impl<State, M0, S0, M1, S1, M2, S2, M3, S3, M4, S4> ViewSeq<State, (M0, M1, M2, M3, M4)> for (S0, S1, S2, S3, S4)
where State: 'static, S0: ViewSeq<State, M0>, S1: ViewSeq<State, M1>, S2: ViewSeq<State, M2>, S3: ViewSeq<State, M3>, S4: ViewSeq<State, M4>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Source§

impl<State, M0, S0, M1, S1, M2, S2, M3, S3> ViewSeq<State, (M0, M1, M2, M3)> for (S0, S1, S2, S3)
where State: 'static, S0: ViewSeq<State, M0>, S1: ViewSeq<State, M1>, S2: ViewSeq<State, M2>, S3: ViewSeq<State, M3>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Source§

impl<State, M0, S0, M1, S1, M2, S2> ViewSeq<State, (M0, M1, M2)> for (S0, S1, S2)
where State: 'static, S0: ViewSeq<State, M0>, S1: ViewSeq<State, M1>, S2: ViewSeq<State, M2>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Source§

impl<State, M0, S0, M1, S1> ViewSeq<State, (M0, M1)> for (S0, S1)
where State: 'static, S0: ViewSeq<State, M0>, S1: ViewSeq<State, M1>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Source§

impl<State, M0, S0> ViewSeq<State, (M0,)> for (S0,)
where State: 'static, S0: ViewSeq<State, M0>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Source§

impl<State, M, S, const N: usize> ViewSeq<State, ArrayOf<M>> for [S; N]
where State: 'static, S: ViewSeq<State, M>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Source§

impl<State, M, S> ViewSeq<State, OptionOf<M>> for Option<S>
where State: 'static, S: ViewSeq<State, M>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Source§

impl<State, M, S> ViewSeq<State, VecOf<M>> for Vec<S>
where State: 'static, S: ViewSeq<State, M>,

Source§

fn extend_views(self, out: &mut Vec<AnyView<State>>)

Implementors§

Source§

impl<State, I> ViewSeq<State, Iter> for Views<I>
where State: 'static, I: IntoIterator, <I as IntoIterator>::Item: View<State>,

Source§

impl<State, V> ViewSeq<State, One> for V
where State: 'static, V: View<State>,