retainedTuple method
Creates a retained node maintaining prior valid data during pending re-evaluations (SWR),
bundled as a ({Bloom<T> data, Bloom<bool> pending}) record.
Implements the Stale-While-Revalidate pattern by masking intermediate Empty states while an upstream asynchronous refresh is in progress, providing both the retained data node and the pending progress facet in a single zero-allocation tuple.
System Architectural Flow
Upstream: [Data 1] ───> [Empty (Pending Fetch)] ───> [Data 2]
Data: [Data 1] ───> [Data 1 (Retained)] ───> [Data 2]
Pending: (false) ───> (true) ───> (false)
Ensures:
- Returns a Dart 3 named record
({Bloom<T> data, Bloom<bool> pending}). - Zero BloomCoupler overhead: directly wires the internal pending facet to the retained node.
- Aligns with
toBloomTupleand seamlessly connects toBloomAsyncBuilder.tuple(...)orBloomAsyncBuilder(bloom: data, pending: pending).
Examples
final (:data, :pending) = remoteFeedBloom.retainedTuple();
Implementation
@pragma('vm:prefer-inline')
({Bloom<T> data, Bloom<bool> pending}) retainedTuple() {
final retained = _RetainedBloom<T>(this);
return (data: retained, pending: _PendingFacetBloom<T>(retained));
}