pub struct BucketChain<S: Bucket> {
content: BTreeMap<S::Timestamp, (u32, S)>,
}
Expand description
A sorted list of buckets, representing data bucketed by timestamp.
Bucket chains support three main APIs: finding buckets for a given timestamp, peeling off buckets up to a frontier, and restoring the chain property. All operations aim to be amortized logarithmic in the number of outstanding timestamps.
We achieve this by storing buckets of increasing size for timestamps that are further out in the future. At the same time, in a well-formed chain, adjacent buckets span a time range at most factor 4 different. Factor 4 means that we can skip at most one bucket size for adjacent buckets, limiting the amount of work we need to do when peeling off buckets or restoring the chain property.
A bucket chain is well-formed if all buckets are within two bits of each other, with an imaginary
bucket of -2 bits at the start. A chain does not need to be well-formed at all times, and supports
peeling and finding even if not well-formed. However, peel
might need to split more buckets to
extract the desired data.
The restore
method can be used to restore the chain property. It needs to be called repeatedly
with a positive amount of fuel while the remaining fuel after the call is non-positive. This
allows the caller to control the amount of work done in a single call and interleave it with
other work.
Fields§
§content: BTreeMap<S::Timestamp, (u32, S)>
Implementations§
Source§impl<S: Bucket> BucketChain<S>
impl<S: Bucket> BucketChain<S>
Sourcepub fn range_of(&self, timestamp: &S::Timestamp) -> Option<Range<S::Timestamp>>
pub fn range_of(&self, timestamp: &S::Timestamp) -> Option<Range<S::Timestamp>>
Find the time range for the bucket that contains data for time timestamp
.
Returns a range of the lower (inclusive) and upper (exclusive) time bound of the bucket,
or None
if there is no bucket for the requested time. Only times that haven’t
been peeled can still be found.
The bounds are only valid until the next call to peel
or restore
.
Sourcepub fn find(&self, timestamp: &S::Timestamp) -> Option<&S>
pub fn find(&self, timestamp: &S::Timestamp) -> Option<&S>
Find the bucket that contains data for time timestamp
. Returns a reference to the bucket,
or None
if there is no bucket for the requested time.
Only times that haven’t been peeled can still be found.
Sourcepub fn find_mut(&mut self, timestamp: &S::Timestamp) -> Option<&mut S>
pub fn find_mut(&mut self, timestamp: &S::Timestamp) -> Option<&mut S>
Find the bucket that contains data for time timestamp
. Returns a mutable reference to
the bucket, or None
if there is no bucket for the requested time.
Only times that haven’t been peeled can still be found.
Sourcepub fn peel(&mut self, frontier: AntichainRef<'_, S::Timestamp>) -> Vec<S>
pub fn peel(&mut self, frontier: AntichainRef<'_, S::Timestamp>) -> Vec<S>
Peel off all data up to frontier
, where the returned buckets contain all
data strictly less than the frontier.
Sourcepub fn restore(&mut self, fuel: &mut i64)
pub fn restore(&mut self, fuel: &mut i64)
Restore the chain property by splitting buckets as necessary.
The chain is well-formed if all buckets are within two bits of each other, with an imaginary bucket of -2 bits just before the smallest bucket.
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true
if the chain is empty. This means there are no outstanding times left.
Sourcefn split_and_insert(
&mut self,
fuel: &mut i64,
bits: u32,
offset: S::Timestamp,
storage: S,
)
fn split_and_insert( &mut self, fuel: &mut i64, bits: u32, offset: S::Timestamp, storage: S, )
Split the bucket specified by (bits, offset, storage)
and insert the new buckets.
Updates fuel
.
Panics if the bucket cannot be split, i.e, it covers 0 bits.
Trait Implementations§
Auto Trait Implementations§
impl<S> Freeze for BucketChain<S>
impl<S> RefUnwindSafe for BucketChain<S>
impl<S> Send for BucketChain<S>where
S: Send,
impl<S> Sync for BucketChain<S>
impl<S> Unpin for BucketChain<S>
impl<S> UnwindSafe for BucketChain<S>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
Source§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the foreground set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red()
and
green()
, which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg()
:
use yansi::{Paint, Color};
painted.fg(Color::White);
Set foreground color to white using white()
.
use yansi::Paint;
painted.white();
Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the background set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red()
and
on_green()
, which have the same functionality but
are pithier.
§Example
Set background color to red using fg()
:
use yansi::{Paint, Color};
painted.bg(Color::Red);
Set background color to red using on_red()
.
use yansi::Paint;
painted.on_red();
Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute
value
.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold()
and
underline()
, which have the same functionality
but are pithier.
§Example
Make text bold using attr()
:
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);
Make text bold using using bold()
.
use yansi::Paint;
painted.bold();
Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi
Quirk
value
.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask()
and
wrap()
, which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk()
:
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);
Enable wrapping using wrap()
.
use yansi::Paint;
painted.wrap();
Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.
fn clear(&self) -> Painted<&T>
resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition
value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted
only when both stdout
and stderr
are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<'a, S, T> Semigroup<&'a S> for Twhere
T: Semigroup<S>,
impl<'a, S, T> Semigroup<&'a S> for Twhere
T: Semigroup<S>,
Source§fn plus_equals(&mut self, rhs: &&'a S)
fn plus_equals(&mut self, rhs: &&'a S)
std::ops::AddAssign
, for types that do not implement AddAssign
.