Skip to main content

IncrementalMatcher

Struct IncrementalMatcher 

Source
pub struct IncrementalMatcher {
    nfa: Arc<Nfa>,
    skip: SkipMode,
    matched: Vec<SeqMatch>,
    frozen_count: usize,
    next_pos: usize,
    seq_index: Vec<Seq>,
    incomplete: bool,
    scan_cursor: usize,
    dead_upto: usize,
    matchless_upto: usize,
    freeze_truncated: bool,
}
Expand description

Incremental wrapper around Nfa::find_matches_dynamic for append-only input.

Rows are fed in ORDER BY order via IncrementalMatcher::advance; their buffer position is implied by feed order and mapped back to a stable seq through seq_index. Everything before next_pos (the skip-resume point after the last frozen match) is immutable and never rescanned.

Fields§

§nfa: Arc<Nfa>

Shared compiled pattern: one matcher per partition (and a fresh one per full consumption), so holding the automaton by Arc instead of by value avoids a deep clone per instance — while still keeping this struct free of a lifetime the executor would have to thread through.

§skip: SkipMode

AFTER MATCH SKIP strategy, shared with the batch path.

§matched: Vec<SeqMatch>

All matches over the rows fed so far. matched[..frozen_count] are frozen (immutable under future appends); the rest is the provisional tail recomputed on every advance.

§frozen_count: usize

Number of leading entries of matched that are frozen.

§next_pos: usize

Buffer position where the next rescan begins: the skip-resume point after the last frozen match (0 while nothing is frozen). The suffix [next_pos, n_rows) is the only mutable region.

§seq_index: Vec<Seq>

seq_index[pos] is the seq of the row fed at buffer position pos. Its length is the number of rows fed so far (the batch n_rows).

§incomplete: bool

Whether the last rescan stopped on a spent budget, leaving matched’s provisional tail a (possibly empty) leftmost-PREFIX of the true match list rather than the full list. While set, absence of a match from provisional() is NOT evidence of absence: the executor must re-derive (fresh budget) before any decision that treats missing matches as decided — the WITHIN-deadline prune in particular would otherwise delete rows carrying a match the truncated scan never reached.

§scan_cursor: usize

Absolute buffer position where a budget-truncated match scan will resume. Unlike matchless_upto, this may follow successful matches: the corresponding leftmost-prefix of matches remains in matched, and the next refresh appends matches found from this cursor. Reset whenever rows are appended or invalidated, because those changes can alter previously provisional matches and their skip-resume positions.

§dead_upto: usize

Positions [next_pos, dead_upto) proven dead at the boundary by the freeze walks of this and earlier visits (next_pos <= matchless_upto <= dead_upto always). Deadness is monotone under appends — a walk reads only rows at or before its position (there is no forward navigation: NEXT inside DEFINE is rejected at bind and decode time), so a position no path can carry to the boundary stays that way as rows arrive — which lets a freeze that ran out of budget resume where it stopped instead of restarting at next_pos. Without this, freezing a match of L rows costs Θ(L²) steps in ONE visit (each of its L positions walks up to L rows), and once that exceeds the per-visit budget the region never freezes: the permanent, non-self-healing shape a long chain pattern (a{600}) otherwise degrades into. Reset to next_pos whenever the rows a verdict was computed over can change (truncation, eviction rebase).

§matchless_upto: usize

Starts [next_pos, matchless_upto) proven MATCHLESS FOREVER by the finder: their walks found no accept and never reached the boundary, so they died entirely on immutable rows (see MatchScan::matchless_upto). The next rescan begins past them. This is the finder’s counterpart of dead_upto — and feeds it, since such a start is dead too: without it, a long run broken by one non-matching row costs Θ(r²) on EVERY rescan (each start walks to the break and dies), past the budget from r ≈ 840, and a partition in that state never completes a rescan again. Same resets as dead_upto.

§freeze_truncated: bool

Whether the last freeze loop stopped on a spent budget with its region unfinished. The executor refreshes on this like on incomplete, so a truncated freeze resumes on the next watermark visit rather than only on the next arrival.

Implementations§

Source§

impl IncrementalMatcher

Source

pub fn new(nfa: Arc<Nfa>, skip: SkipMode) -> Self

Source

pub fn reset(&mut self)

Reset to the freshly-constructed state, keeping the (shared) automaton and skip mode and reusing the collections’ allocations. Equivalent to a new matcher: used when a consumed prefix swallows the whole buffer, where reconstructing would re-clone the skip mode for nothing.

Source

pub fn is_incomplete(&self) -> bool

Whether the last rescan was truncated by a spent budget — see the field doc. While true, provisional() is a leftmost-prefix under-approximation.

Source

pub fn needs_refresh(&self) -> bool

Whether a visit’s rescan should be re-run with a fresh budget before deciding anything: the provisional tail is incomplete (IncrementalMatcher::is_incomplete), or the freeze stopped on a spent budget and has proven-dead progress to resume from.

Source

pub async fn refresh( &mut self, matcher: &(impl CandidateMatcher + Sync), budget: &mut ScanBudget, memoize: bool, ) -> StreamExecutorResult<()>

Re-derive the provisional tail with a fresh budget, without feeding rows: the executor’s recovery valve for IncrementalMatcher::is_incomplete. Delegates to the same rescan advance performs.

Source

pub fn resume_pos(&self) -> usize

The skip-resume position after the last frozen match — the left edge of the still-revisable region, in fed-position (= the executor’s buffer-index) terms. The executor’s emission gate re-checks gap liveness from here: a position in [resume_pos, match start) that is still alive at the boundary can produce an earlier, leftmost-preferred match and must hold the emission.

Source

pub fn dead_prefix_end(&self) -> usize

End of the prefix of fed positions proven dead at the boundary — every position below it can never again start a match (see the dead_upto field). The executor’s own liveness walks (the dead-prefix prune, the emission gate’s gap check) skip these positions instead of re-deriving a verdict the freeze already paid for.

Source

pub async fn advance( &mut self, new_row_seqs: &[Seq], matcher: &(impl CandidateMatcher + Sync), budget: &mut ScanBudget, memoize: bool, ) -> StreamExecutorResult<()>

Feed rows appended in ORDER BY order. new_row_seqs are the seqs of the newly appended rows; their buffer positions are the next positions after the rows fed so far. An empty call is a no-op.

Rescans only the mutable suffix [next_pos, n_rows) via the budgeted, memoized pull scan (Nfa::next_match through an OffsetMatcher), replacing the provisional tail of matched. It then freezes the leading run of suffix matches whose entire scan region [cursor, skip-resume) is dead at the boundary per Nfa::reaches_boundary_alive, advancing next_pos to the last frozen match’s resume position. Checking the whole region — not just the match’s start — matters: a gap position before the match can be alive (a longer, higher-preference alternative still in flight) and a future row could then produce a match there that consumes past this one, so nothing behind that gap may freeze. Liveness is checked with the raw matcher at absolute positions (only the finder needs the offset adapter, because it always scans from 0).

Source

async fn rescan( &mut self, matcher: &(impl CandidateMatcher + Sync), budget: &mut ScanBudget, memoize: bool, ) -> StreamExecutorResult<()>

Re-derive the provisional tail over the already-fed mutable suffix [next_pos, n_rows) without feeding new rows — the rescan half of IncrementalMatcher::advance, exposed for the one caller shape where a rescan must happen with nothing to feed: an over-feed rollback. When rows beyond the caller’s current window were fed (e.g. an emit-on-update whole-buffer feed followed by a watermark visit over just the safe prefix), IncrementalMatcher::truncate_from_seq at the first over-fed row rolls the tail back but also drops every provisional match over the retained fed suffix; those rows are still fed, so there is nothing to advance (re-feeding them would double-enter seq_index) and the dropped matches must be re-derived in place. After this call provisional() equals a from-scratch batch scan of the fed rows.

Source

pub fn finalize_evicted_prefix(&mut self, boundary: Seq) -> Finalized

Finalize the evicted prefix in place, or report that the matcher must be rebuilt. The caller is evicting [.., boundary) rows from its buffer; boundary is the first row seq that is not evicted (an exclusive upper bound). On success the matches lying wholly within the evicted prefix leave the diffable set, the surviving matcher is rebased onto the surviving buffer, and IncrementalMatcher::provisional then returns only still-revisable matches. The finalized matches are not returned (see Finalized::Rebased); tests derive them by diffing provisional() before/after.

This owns the finalize-vs-rebuild decision the executor used to make itself. It returns Finalized::MustRebuild — leaving the matcher untouched — in the shapes where an in-place rebase is unsound, so the executor never needs to pre-check (and no debug assertion can trip nor next_pos -= final_pos underflow):

  • Boundary never fed (only unfed/unsafe rows survive) or past the frozen prefix (final_pos > next_pos): finalization would reach into the open, still-revisable region.
  • A frozen match straddles the boundary strictly inside the frozen prefix — it starts before final_pos and ends after, while final_pos < next_pos. This arises only under the overlapping skip modes (TO NEXT ROW/TO FIRST/TO LAST), whose resume precedes the match end so a frozen span can outrun its own resume; see the consume/keep walk below for why it is declined. It is not reachable through the executor’s eviction (which always lands the boundary at final_pos == next_pos, see below), only through a direct API call.

Why the overlapping skip modes now rebase (they previously always rebuilt): the executor evicts from the first row still live at the safe boundary. Every position in [0, next_pos) was liveness-checked dead when its region froze, and deadness is monotone in the boundary, so at the (same-or-later) eviction boundary [0, next_pos) is still dead and the first live row is >= next_pos. The check above bounds final_pos <= next_pos, so through the executor final_pos == next_pos exactly. At that boundary every frozen match starts before next_pos and is therefore consumed — none is retained — so next_pos rebases to 0 and the entire surviving suffix is re-derived from scratch as the provisional tail. provisional() then trivially equals a fresh scan over the survivors, regardless of skip mode, and no rebased scan cursor can skip a start a fresh matcher would find. PAST LAST ROW additionally tiles [0, next_pos) with non-overlapping spans (resume == end), so any boundary within the frozen prefix retains a suffix of frozen matches soundly.

On Finalized::Rebased the evicted rows physically leave the front of the logical buffer: seq_index drains its prefix and next_pos/frozen_count shift down. Only rows at positions >= final_pos survive, and rebasing is a uniform downward shift of those rows; paths forward from a surviving position consume only surviving (unchanged) rows, so the freezing-soundness argument (a frozen region is dead at its boundary) is preserved. Match spans are anchored by seq, so retained and returned SeqMatches keep their identities without adjustment.

Source

pub fn provisional(&self) -> &[SeqMatch]

Current provisional matches over everything fed so far, as if input ended now.

Auto Trait Implementations§

Blanket Implementations§

§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<U> As for U

§

fn as_<T>(self) -> T
where T: CastFrom<U>, U: Sized,

Casts self to type T. The semantics of numeric casting with the as operator are followed, so <T as As>::as_::<U> can be used in the same way as T as U for numeric conversions. Read more
§

impl<T> AsAny for T
where T: Any,

§

fn as_any(&self) -> &(dyn Any + 'static)

§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

§

fn type_name(&self) -> &'static str

Gets the type name of self
§

impl<T> AsAny for T
where T: Any + Send + Sync,

§

fn any_ref(&self) -> &(dyn Any + Sync + Send + 'static)

Obtains a dyn Any reference to the object: Read more
§

fn as_any(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Obtains an Arc<dyn Any> reference to the object: Read more
§

fn into_any(self: Box<T>) -> Box<dyn Any + Sync + Send>

Converts the object to Box<dyn Any>: Read more
§

fn type_name(&self) -> &'static str

Convenient wrapper for std::any::type_name, since Any does not provide it and Any::type_id is useless as a debugging aid (its Debug is just a mess of hex digits).
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> Downcast for T
where T: AsAny + ?Sized,

§

fn is<T>(&self) -> bool
where T: AsAny,

Returns true if the boxed type is the same as T. Read more
§

fn downcast_ref<T>(&self) -> Option<&T>
where T: AsAny,

Forward to the method defined on the type Any.
§

fn downcast_mut<T>(&mut self) -> Option<&mut T>
where T: AsAny,

Forward to the method defined on the type Any.
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSend for T
where T: Any + Send,

§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Sync + Send>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

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

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

fn in_current_span(self) -> Instrumented<Self>

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

impl<T> Instrument for T

Source§

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

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

fn in_current_span(self) -> Instrumented<Self>

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

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<T> IntoResult<T> for T

§

type Err = Infallible

§

fn into_result(self) -> Result<T, <T as IntoResult<T>>::Err>

§

impl<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
Source§

impl<T> LruValue for T
where T: Send + Sync,

§

impl<T> MaybeSend for T
where T: Send,

§

impl<T> MaybeSend for T
where T: Send,

Source§

impl<M> MetricVecRelabelExt for M

Source§

fn relabel( self, metric_level: MetricLevel, relabel_threshold: MetricLevel, ) -> RelabeledMetricVec<M>

Source§

fn relabel_n( self, metric_level: MetricLevel, relabel_threshold: MetricLevel, relabel_num: usize, ) -> RelabeledMetricVec<M>

Source§

fn relabel_debug_1( self, relabel_threshold: MetricLevel, ) -> RelabeledMetricVec<M>

Equivalent to RelabeledMetricVec::with_metric_level_relabel_n with metric_level set to MetricLevel::Debug and relabel_num set to 1.
§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Scope for T

§

fn with<F, R>(self, f: F) -> R
where Self: Sized, F: FnOnce(Self) -> R,

Scoped with ownership.
§

fn with_ref<F, R>(&self, f: F) -> R
where F: FnOnce(&Self) -> R,

Scoped with reference.
§

fn with_mut<F, R>(&mut self, f: F) -> R
where F: FnOnce(&mut Self) -> R,

Scoped with mutable reference.
Source§

impl<T> SerTo<T> for T

§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

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

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

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

The type returned in the event of a conversion error.
Source§

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

Performs the conversion.
§

impl<KernelType, ArrowType> TryIntoArrow<ArrowType> for KernelType
where ArrowType: TryFromKernel<KernelType>,

§

fn try_into_arrow(self) -> Result<ArrowType, ArrowError>

§

impl<KernelType, ArrowType> TryIntoKernel<KernelType> for ArrowType
where KernelType: TryFromArrow<ArrowType>,

§

fn try_into_kernel(self) -> Result<KernelType, ArrowError>

§

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

§

fn vzip(self) -> V

§

impl<T> Value for T
where T: Send + Sync + 'static,

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more