struct TableTransaction<K, V> {
initial: BTreeMap<K, V>,
pending: BTreeMap<K, Vec<TransactionUpdate<V>>>,
uniqueness_violation: Option<fn(a: &V, b: &V) -> bool>,
}
Expand description
TableTransaction emulates some features of a typical SQL transaction over table for a Collection.
It supports:
- uniqueness constraints
- transactional reads and writes (including read-your-writes before commit)
K
is the primary key type. Multiple entries with the same key are disallowed.
V
is the an arbitrary value type.
Fields§
§initial: BTreeMap<K, V>
§pending: BTreeMap<K, Vec<TransactionUpdate<V>>>
§uniqueness_violation: Option<fn(a: &V, b: &V) -> bool>
Implementations§
Source§impl<K, V> TableTransaction<K, V>
impl<K, V> TableTransaction<K, V>
Sourcefn new<KP, VP>(initial: BTreeMap<KP, VP>) -> Result<Self, TryFromProtoError>
fn new<KP, VP>(initial: BTreeMap<KP, VP>) -> Result<Self, TryFromProtoError>
Create a new TableTransaction with initial data.
Internally the catalog serializes data as protobuf. All fields in a proto message are
optional, which makes using them in Rust cumbersome. Generic parameters KP
and VP
are
protobuf types which deserialize to K
and V
that a TableTransaction
is generic
over.
Sourcefn new_with_uniqueness_fn<KP, VP>(
initial: BTreeMap<KP, VP>,
uniqueness_violation: fn(a: &V, b: &V) -> bool,
) -> Result<Self, TryFromProtoError>
fn new_with_uniqueness_fn<KP, VP>( initial: BTreeMap<KP, VP>, uniqueness_violation: fn(a: &V, b: &V) -> bool, ) -> Result<Self, TryFromProtoError>
Like Self::new
, but you can also provide uniqueness_violation
, which is a function
that determines whether there is a uniqueness violation among two values.
Sourcefn pending<KP, VP>(self) -> Vec<(KP, VP, Diff)>
fn pending<KP, VP>(self) -> Vec<(KP, VP, Diff)>
Consumes and returns the pending changes and their diffs. Diff
is
guaranteed to be 1 or -1.
Sourcefn verify(&self) -> Result<(), DurableCatalogError>
fn verify(&self) -> Result<(), DurableCatalogError>
Verifies that no items in self
violate self.uniqueness_violation
.
Runtime is O(n^2), where n is the number of items in self
, if
UniqueName::HAS_UNIQUE_NAME
is false for V
. Prefer using Self::verify_keys
.
Sourcefn verify_keys<'a>(
&self,
keys: impl IntoIterator<Item = &'a K>,
) -> Result<(), DurableCatalogError>where
K: 'a,
fn verify_keys<'a>(
&self,
keys: impl IntoIterator<Item = &'a K>,
) -> Result<(), DurableCatalogError>where
K: 'a,
Verifies that no items in self
violate self.uniqueness_violation
with keys
.
Runtime is O(n * k), where n is the number of items in self
and k is the number of
items in keys
.
Sourcefn for_values<'a, F: FnMut(&'a K, &'a V)>(&'a self, f: F)
fn for_values<'a, F: FnMut(&'a K, &'a V)>(&'a self, f: F)
Iterates over the items viewable in the current transaction in arbitrary
order and applies f
on all key, value pairs.
Sourcefn items(&self) -> BTreeMap<&K, &V>
fn items(&self) -> BTreeMap<&K, &V>
Returns the items viewable in the current transaction as references. Returns a map of references.
Sourcefn values(&self) -> BTreeSet<&V>
fn values(&self) -> BTreeSet<&V>
Returns the values viewable in the current transaction as references.
Sourcefn for_values_mut<F: FnMut(&mut BTreeMap<K, Vec<TransactionUpdate<V>>>, &K, &V)>(
&mut self,
f: F,
)
fn for_values_mut<F: FnMut(&mut BTreeMap<K, Vec<TransactionUpdate<V>>>, &K, &V)>( &mut self, f: F, )
Iterates over the items viewable in the current transaction, and provides a map where additional pending items can be inserted, which will be appended to current pending items. Does not verify uniqueness.
Sourcefn insert(&mut self, k: K, v: V, ts: u64) -> Result<(), DurableCatalogError>
fn insert(&mut self, k: K, v: V, ts: u64) -> Result<(), DurableCatalogError>
Inserts a new k,v pair.
Returns an error if the uniqueness check failed or the key already exists.
Sourcefn update<F: Fn(&K, &V) -> Option<V>>(
&mut self,
f: F,
ts: u64,
) -> Result<Diff, DurableCatalogError>
fn update<F: Fn(&K, &V) -> Option<V>>( &mut self, f: F, ts: u64, ) -> Result<Diff, DurableCatalogError>
Updates k, v pairs. f
is a function that can return Some(V)
if the
value should be updated, otherwise None
. Returns the number of changed
entries.
Returns an error if the uniqueness check failed.
Prefer using Self::update_by_key
or Self::update_by_keys
, which generally have
better performance.
Sourcefn update_by_key(
&mut self,
k: K,
v: V,
ts: u64,
) -> Result<bool, DurableCatalogError>
fn update_by_key( &mut self, k: K, v: V, ts: u64, ) -> Result<bool, DurableCatalogError>
Updates k
, v
pair if k
already exists in self
.
Returns true
if k
was updated, false
otherwise.
Returns an error if the uniqueness check failed.
Sourcefn update_by_keys(
&mut self,
kvs: impl IntoIterator<Item = (K, V)>,
ts: u64,
) -> Result<Diff, DurableCatalogError>
fn update_by_keys( &mut self, kvs: impl IntoIterator<Item = (K, V)>, ts: u64, ) -> Result<Diff, DurableCatalogError>
Updates k, v pairs. Keys that don’t already exist in self
are ignored.
Returns the number of changed entries. Returns an error if the uniqueness check failed.
Sourcefn set(
&mut self,
k: K,
v: Option<V>,
ts: u64,
) -> Result<Option<V>, DurableCatalogError>
fn set( &mut self, k: K, v: Option<V>, ts: u64, ) -> Result<Option<V>, DurableCatalogError>
Set the value for a key. Returns the previous entry if the key existed, otherwise None.
Returns an error if the uniqueness check failed.
DO NOT call this function in a loop, use Self::set_many
instead.
Sourcefn set_many(
&mut self,
kvs: BTreeMap<K, Option<V>>,
ts: u64,
) -> Result<BTreeMap<K, Option<V>>, DurableCatalogError>
fn set_many( &mut self, kvs: BTreeMap<K, Option<V>>, ts: u64, ) -> Result<BTreeMap<K, Option<V>>, DurableCatalogError>
Set the values for many keys. Returns the previous entry for each key if the key existed, otherwise None.
Returns an error if any uniqueness check failed.
Sourcefn delete<F: Fn(&K, &V) -> bool>(&mut self, f: F, ts: u64) -> Vec<(K, V)>
fn delete<F: Fn(&K, &V) -> bool>(&mut self, f: F, ts: u64) -> Vec<(K, V)>
Deletes items for which f
returns true. Returns the keys and values of
the deleted entries.
Prefer using Self::delete_by_key
or Self::delete_by_keys
, which generally have
better performance.
Sourcefn delete_by_key(&mut self, k: K, ts: u64) -> Option<V>
fn delete_by_key(&mut self, k: K, ts: u64) -> Option<V>
Deletes item with key k
.
Returns the value of the deleted entry, if it existed.
Sourcefn delete_by_keys(
&mut self,
ks: impl IntoIterator<Item = K>,
ts: u64,
) -> Vec<(K, V)>
fn delete_by_keys( &mut self, ks: impl IntoIterator<Item = K>, ts: u64, ) -> Vec<(K, V)>
Deletes items with key in ks
.
Returns the keys and values of the deleted entries.
Trait Implementations§
Auto Trait Implementations§
impl<K, V> Freeze for TableTransaction<K, V>
impl<K, V> RefUnwindSafe for TableTransaction<K, V>where
K: RefUnwindSafe,
V: RefUnwindSafe,
impl<K, V> Send for TableTransaction<K, V>
impl<K, V> Sync for TableTransaction<K, V>
impl<K, V> Unpin for TableTransaction<K, V>
impl<K, V> UnwindSafe for TableTransaction<K, V>where
K: RefUnwindSafe,
V: RefUnwindSafe,
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> Downcast for T
impl<T> Downcast for T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.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, U> OverrideFrom<Option<&T>> for Uwhere
U: OverrideFrom<T>,
impl<T, U> OverrideFrom<Option<&T>> for Uwhere
U: OverrideFrom<T>,
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> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.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<P, R> ProtoType<R> for Pwhere
R: RustType<P>,
impl<P, R> ProtoType<R> for Pwhere
R: RustType<P>,
Source§fn into_rust(self) -> Result<R, TryFromProtoError>
fn into_rust(self) -> Result<R, TryFromProtoError>
RustType::from_proto
.Source§fn from_rust(rust: &R) -> P
fn from_rust(rust: &R) -> P
RustType::into_proto
.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
.Source§impl<T> ServiceExt for T
impl<T> ServiceExt for T
Source§fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
Source§fn decompression(self) -> Decompression<Self>where
Self: Sized,
fn decompression(self) -> Decompression<Self>where
Self: Sized,
Source§fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
Source§fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
Source§fn follow_redirects(self) -> FollowRedirect<Self>where
Self: Sized,
fn follow_redirects(self) -> FollowRedirect<Self>where
Self: Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.