Skip to content

Commit 6300718

Browse files
committed
Remove Data trait
Signed-off-by: Moritz Hoffmann <[email protected]>
1 parent 96079f8 commit 6300718

35 files changed

+101
-125
lines changed

timely/src/dataflow/channels/pact.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ use crate::dataflow::channels::Message;
1818
use crate::logging::{TimelyLogger as Logger, MessagesEvent};
1919
use crate::progress::Timestamp;
2020
use crate::worker::AsWorker;
21-
use crate::Data;
2221

2322
/// A `ParallelizationContract` allocates paired `Push` and `Pull` implementors.
2423
pub trait ParallelizationContract<T, C> {
@@ -84,7 +83,7 @@ impl<T: Timestamp, CB, H: 'static> ParallelizationContract<T, CB::Container> for
8483
where
8584
CB: ContainerBuilder,
8685
CB: for<'a> PushInto<<CB::Container as Container>::Item<'a>>,
87-
CB::Container: Data + Send + SizableContainer + crate::dataflow::channels::ContainerBytes,
86+
CB::Container: Send + SizableContainer + crate::dataflow::channels::ContainerBytes,
8887
for<'a> H: FnMut(&<CB::Container as Container>::Item<'a>) -> u64
8988
{
9089
type Pusher = ExchangePusher<T, CB, LogPusher<T, CB::Container, Box<dyn Push<Message<T, CB::Container>>>>, H>;

timely/src/dataflow/channels/pushers/exchange.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use crate::communication::Push;
44
use crate::container::{ContainerBuilder, SizableContainer, PushInto};
55
use crate::dataflow::channels::Message;
6-
use crate::{Container, Data};
6+
use crate::Container;
77

88
// TODO : Software write combining
99
/// Distributes records among target pushees according to a distribution function.
@@ -50,7 +50,7 @@ where
5050
}
5151
}
5252

53-
impl<T: Eq+Data, CB, P, H> Push<Message<T, CB::Container>> for Exchange<T, CB, P, H>
53+
impl<T: Eq+Clone, CB, P, H> Push<Message<T, CB::Container>> for Exchange<T, CB, P, H>
5454
where
5555
CB: ContainerBuilder,
5656
CB::Container: SizableContainer,

timely/src/dataflow/channels/pushers/owned.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use std::fmt;
55
use std::rc::Rc;
66

77
use timely_communication::Push;
8-
use crate::{Data, Container};
98
use crate::dataflow::channels::Message;
109

1110
/// A pusher that can bind to a single downstream pusher.
@@ -37,7 +36,7 @@ impl<T, D> Clone for PushOwned<T, D> {
3736
}
3837
}
3938

40-
impl<T: Data, D: Container> Push<Message<T, D>> for PushOwned<T, D> {
39+
impl<T, D> Push<Message<T, D>> for PushOwned<T, D> {
4140
#[inline]
4241
fn push(&mut self, message: &mut Option<Message<T, D>>) {
4342
let mut pusher = self.0.borrow_mut();

timely/src/dataflow/channels/pushers/tee.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::rc::Rc;
77
use crate::dataflow::channels::Message;
88

99
use crate::communication::Push;
10-
use crate::{Container, Data};
10+
use crate::Container;
1111

1212
type PushList<T, C> = Rc<RefCell<Vec<Box<dyn Push<Message<T, C>>>>>>;
1313

@@ -17,7 +17,7 @@ pub struct Tee<T, C> {
1717
shared: PushList<T, C>,
1818
}
1919

20-
impl<T: Data, C: Container + Data> Push<Message<T, C>> for Tee<T, C> {
20+
impl<T: Clone + 'static, C: Container + Clone + 'static> Push<Message<T, C>> for Tee<T, C> {
2121
#[inline]
2222
fn push(&mut self, message: &mut Option<Message<T, C>>) {
2323
let mut pushers = self.shared.borrow_mut();

timely/src/dataflow/operators/aggregation/aggregate.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
use std::hash::Hash;
33
use std::collections::HashMap;
44

5-
use crate::{Data, ExchangeData};
5+
use crate::ExchangeData;
66
use crate::dataflow::{Scope, StreamLike, OwnedStream};
77
use crate::dataflow::operators::generic::operator::Operator;
88
use crate::dataflow::channels::pact::Exchange;
@@ -60,7 +60,7 @@ pub trait Aggregate<S: Scope, K: ExchangeData+Hash, V: ExchangeData> {
6060
/// .inspect(|x| assert!(*x == (0, 5) || *x == (1, 5)));
6161
/// });
6262
/// ```
63-
fn aggregate<R: Data, D: Default+'static, F: Fn(&K, V, &mut D)+'static, E: Fn(K, D)->R+'static, H: Fn(&K)->u64+'static>(
63+
fn aggregate<R: 'static, D: Default+'static, F: Fn(&K, V, &mut D)+'static, E: Fn(K, D)->R+'static, H: Fn(&K)->u64+'static>(
6464
self,
6565
fold: F,
6666
emit: E,
@@ -75,7 +75,7 @@ where
7575
S: StreamLike<G, Vec<(K, V)>>,
7676
{
7777

78-
fn aggregate<R: Data, D: Default+'static, F: Fn(&K, V, &mut D)+'static, E: Fn(K, D)->R+'static, H: Fn(&K)->u64+'static>(
78+
fn aggregate<R: 'static, D: Default+'static, F: Fn(&K, V, &mut D)+'static, E: Fn(K, D)->R+'static, H: Fn(&K)->u64+'static>(
7979
self,
8080
fold: F,
8181
emit: E,

timely/src/dataflow/operators/aggregation/state_machine.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
use std::hash::Hash;
33
use std::collections::HashMap;
44

5-
use crate::{Data, ExchangeData};
5+
use crate::ExchangeData;
66
use crate::dataflow::{OwnedStream, Scope, StreamLike};
77
use crate::dataflow::operators::generic::operator::Operator;
88
use crate::dataflow::channels::pact::Exchange;
@@ -46,7 +46,7 @@ pub trait StateMachine<S: Scope, K: ExchangeData+Hash+Eq, V: ExchangeData> {
4646
/// });
4747
/// ```
4848
fn state_machine<
49-
R: Data, // output type
49+
R: 'static, // output type
5050
D: Default+'static, // per-key state (data)
5151
I: IntoIterator<Item=R>, // type of output iterator
5252
F: Fn(&K, V, &mut D)->(bool, I)+'static, // state update logic
@@ -62,7 +62,7 @@ where
6262
S: StreamLike<G, Vec<(K, V)>>,
6363
{
6464
fn state_machine<
65-
R: Data, // output type
65+
R: 'static, // output type
6666
D: Default+'static, // per-key state (data)
6767
I: IntoIterator<Item=R>, // type of output iterator
6868
F: Fn(&K, V, &mut D)->(bool, I)+'static, // state update logic

timely/src/dataflow/operators/branch.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
use crate::dataflow::channels::pact::Pipeline;
44
use crate::dataflow::operators::generic::builder_rc::OperatorBuilder;
55
use crate::dataflow::{Scope, OwnedStream, StreamLike};
6-
use crate::{Container, Data};
6+
use crate::Container;
77

88
/// Extension trait for `Stream`.
9-
pub trait Branch<S: Scope, D: Data> {
9+
pub trait Branch<S: Scope, D> {
1010
/// Takes one input stream and splits it into two output streams.
1111
/// For each record, the supplied closure is called with a reference to
1212
/// the data and its time. If it returns `true`, the record will be sent
@@ -34,7 +34,7 @@ pub trait Branch<S: Scope, D: Data> {
3434
) -> (OwnedStream<S, Vec<D>>, OwnedStream<S, Vec<D>>);
3535
}
3636

37-
impl<G: Scope, D: Data, S: StreamLike<G, Vec<D>>> Branch<G, D> for S {
37+
impl<G: Scope, D: 'static, S: StreamLike<G, Vec<D>>> Branch<G, D> for S {
3838
fn branch(
3939
self,
4040
condition: impl Fn(&G::Timestamp, &D) -> bool + 'static,
@@ -92,7 +92,7 @@ pub trait BranchWhen<G: Scope, C: Container>: Sized {
9292
fn branch_when(self, condition: impl Fn(&G::Timestamp) -> bool + 'static) -> (OwnedStream<G, C>, OwnedStream<G, C>);
9393
}
9494

95-
impl<G: Scope, C: Container + Data, S: StreamLike<G, C>> BranchWhen<G, C> for S {
95+
impl<G: Scope, C: Container + 'static, S: StreamLike<G, C>> BranchWhen<G, C> for S {
9696
fn branch_when(self, condition: impl Fn(&G::Timestamp) -> bool + 'static) -> (OwnedStream<G, C>, OwnedStream<G, C>) {
9797
let mut builder = OperatorBuilder::new("Branch".to_owned(), self.scope());
9898

timely/src/dataflow/operators/broadcast.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub trait Broadcast<G: Scope, D: ExchangeData> {
2121
fn broadcast(self) -> OwnedStream<G, Vec<D>>;
2222
}
2323

24-
impl<G: Scope, D: ExchangeData, S: StreamLike<G, Vec<D>>> Broadcast<G, D> for S {
24+
impl<G: Scope, D: ExchangeData + Clone, S: StreamLike<G, Vec<D>>> Broadcast<G, D> for S {
2525
fn broadcast(self) -> OwnedStream<G, Vec<D>> {
2626

2727
// NOTE: Simplified implementation due to underlying motion

timely/src/dataflow/operators/core/enterleave.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use crate::logging::{TimelyLogger, MessagesEvent};
2525
use crate::progress::Timestamp;
2626
use crate::progress::timestamp::Refines;
2727
use crate::progress::{Source, Target};
28-
use crate::{Container, Data};
28+
use crate::Container;
2929
use crate::communication::Push;
3030
use crate::dataflow::channels::pushers::{Counter, PushOwned};
3131
use crate::dataflow::channels::Message;
@@ -53,7 +53,7 @@ pub trait Enter<G: Scope, T: Timestamp+Refines<G::Timestamp>, C: Container> {
5353
fn enter<'a>(self, _: &Child<'a, G, T>) -> OwnedStream<Child<'a, G, T>, C>;
5454
}
5555

56-
impl<G: Scope, T: Timestamp+Refines<G::Timestamp>, C: Data+Container, S: StreamLike<G, C>> Enter<G, T, C> for S {
56+
impl<G: Scope, T: Timestamp+Refines<G::Timestamp>, C: Container + 'static, S: StreamLike<G, C>> Enter<G, T, C> for S {
5757
fn enter<'a>(self, scope: &Child<'a, G, T>) -> OwnedStream<Child<'a, G, T>, C> {
5858

5959
use crate::scheduling::Scheduler;
@@ -130,14 +130,14 @@ impl<'a, G: Scope, C: Container + 'static, T: Timestamp+Refines<G::Timestamp>, S
130130
}
131131

132132

133-
struct IngressNub<TOuter: Timestamp, TInner: Timestamp+Refines<TOuter>, TContainer: Container + Data> {
133+
struct IngressNub<TOuter: Timestamp, TInner: Timestamp+Refines<TOuter>, TContainer: Container> {
134134
targets: Counter<TInner, TContainer, PushOwned<TInner, TContainer>>,
135135
phantom: PhantomData<TOuter>,
136136
activator: crate::scheduling::Activator,
137137
active: bool,
138138
}
139139

140-
impl<TOuter: Timestamp, TInner: Timestamp+Refines<TOuter>, TContainer: Container + Data> Push<Message<TOuter, TContainer>> for IngressNub<TOuter, TInner, TContainer> {
140+
impl<TOuter: Timestamp, TInner: Timestamp+Refines<TOuter>, TContainer: Container> Push<Message<TOuter, TContainer>> for IngressNub<TOuter, TInner, TContainer> {
141141
fn push(&mut self, element: &mut Option<Message<TOuter, TContainer>>) {
142142
if let Some(outer_message) = element {
143143
let data = ::std::mem::take(&mut outer_message.data);

timely/src/dataflow/operators/core/feedback.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Create cycles in a timely dataflow graph.
22
3-
use crate::{Container, Data};
3+
use crate::Container;
44
use crate::container::CapacityContainerBuilder;
55
use crate::dataflow::channels::pact::Pipeline;
66
use crate::dataflow::channels::pushers::PushOwned;
@@ -85,7 +85,7 @@ impl<'a, G: Scope, T: Timestamp> LoopVariable<'a, G, T> for Iterative<'a, G, T>
8585
}
8686

8787
/// Connect a `Stream` to the input of a loop variable.
88-
pub trait ConnectLoop<G: Scope, C: Container + Data> {
88+
pub trait ConnectLoop<G: Scope, C: Container> {
8989
/// Connect a `Stream` to be the input of a loop variable.
9090
///
9191
/// # Examples
@@ -106,7 +106,7 @@ pub trait ConnectLoop<G: Scope, C: Container + Data> {
106106
fn connect_loop(self, handle: Handle<G, C>);
107107
}
108108

109-
impl<G: Scope, C: Container + Data, S: StreamLike<G, C>> ConnectLoop<G, C> for S {
109+
impl<G: Scope, C: Container + 'static, S: StreamLike<G, C>> ConnectLoop<G, C> for S {
110110
fn connect_loop(self, handle: Handle<G, C>) {
111111

112112
let mut builder = handle.builder;

timely/src/dataflow/operators/core/filter.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
//! Filters a stream by a predicate.
22
use crate::container::{Container, SizableContainer, PushInto};
3-
use crate::Data;
43
use crate::dataflow::channels::pact::Pipeline;
54
use crate::dataflow::{OwnedStream, Scope, StreamLike};
65
use crate::dataflow::operators::generic::operator::Operator;
@@ -23,7 +22,7 @@ pub trait Filter<G: Scope, C: Container> {
2322
fn filter<P: FnMut(&C::Item<'_>)->bool+'static>(self, predicate: P) -> OwnedStream<G, C>;
2423
}
2524

26-
impl<G: Scope, C: SizableContainer + Data, S: StreamLike<G, C>> Filter<G, C> for S
25+
impl<G: Scope, C: SizableContainer + 'static, S: StreamLike<G, C>> Filter<G, C> for S
2726
where
2827
for<'a> C: PushInto<C::Item<'a>>
2928
{

timely/src/dataflow/operators/core/input.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::progress::frontier::Antichain;
1111
use crate::progress::{Operate, operate::SharedProgress, Timestamp, ChangeBatch};
1212
use crate::progress::Source;
1313

14-
use crate::{Container, Data};
14+
use crate::Container;
1515
use crate::communication::Push;
1616
use crate::dataflow::{OwnedStream, Scope, ScopeParent};
1717
use crate::dataflow::channels::pushers::{Counter, PushOwned};
@@ -60,7 +60,7 @@ pub trait Input : Scope {
6060
/// }
6161
/// });
6262
/// ```
63-
fn new_input<C: Container + Data>(&mut self) -> (Handle<<Self as ScopeParent>::Timestamp, CapacityContainerBuilder<C>>, OwnedStream<Self, C>);
63+
fn new_input<C: Container + Clone + 'static>(&mut self) -> (Handle<<Self as ScopeParent>::Timestamp, CapacityContainerBuilder<C>>, OwnedStream<Self, C>);
6464

6565
/// Create a new [StreamCore] and [Handle] through which to supply input.
6666
///
@@ -141,7 +141,7 @@ pub trait Input : Scope {
141141

142142
use crate::order::TotalOrder;
143143
impl<G: Scope> Input for G where <G as ScopeParent>::Timestamp: TotalOrder {
144-
fn new_input<C: Container + Data>(&mut self) -> (Handle<<G as ScopeParent>::Timestamp, CapacityContainerBuilder<C>>, OwnedStream<G, C>) {
144+
fn new_input<C: Container + Clone + 'static>(&mut self) -> (Handle<<G as ScopeParent>::Timestamp, CapacityContainerBuilder<C>>, OwnedStream<G, C>) {
145145
let mut handle = Handle::new();
146146
let stream = self.input_from(&mut handle);
147147
(handle, stream)
@@ -240,7 +240,7 @@ where
240240
now_at: T,
241241
}
242242

243-
impl<T: Timestamp, C: Container + Data> Handle<T, CapacityContainerBuilder<C>> {
243+
impl<T: Timestamp, C: Container + Clone + 'static> Handle<T, CapacityContainerBuilder<C>> {
244244
/// Allocates a new input handle, from which one can create timely streams.
245245
///
246246
/// # Examples

timely/src/dataflow/operators/core/inspect.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Extension trait and implementation for observing and action on streamed data.
22
3-
use crate::{Container, Data};
3+
use crate::Container;
44
use crate::dataflow::channels::pact::Pipeline;
55
use crate::dataflow::{Scope, OwnedStream, StreamLike};
66
use crate::dataflow::operators::generic::Operator;
@@ -90,7 +90,7 @@ pub trait Inspect<G: Scope, C: Container>: InspectCore<G, C> + Sized {
9090
fn inspect_core<F>(self, func: F) -> OwnedStream<G, C> where F: FnMut(Result<(&G::Timestamp, &C), &[G::Timestamp]>)+'static;
9191
}
9292

93-
impl<G: Scope, C: Container + Data, S: StreamLike<G, C>> Inspect<G, C> for S {
93+
impl<G: Scope, C: Container + 'static, S: StreamLike<G, C>> Inspect<G, C> for S {
9494
fn inspect_core<F>(self, func: F) -> OwnedStream<G, C> where F: FnMut(Result<(&G::Timestamp, &C), &[G::Timestamp]>) + 'static {
9595
self.inspect_container(func)
9696
}
@@ -120,7 +120,7 @@ pub trait InspectCore<G: Scope, C: Container> {
120120
fn inspect_container<F>(self, func: F) -> OwnedStream<G, C> where F: FnMut(Result<(&G::Timestamp, &C), &[G::Timestamp]>)+'static;
121121
}
122122

123-
impl<G: Scope, C: Container + Data, S: StreamLike<G, C>> InspectCore<G, C> for S {
123+
impl<G: Scope, C: Container + 'static, S: StreamLike<G, C>> InspectCore<G, C> for S {
124124

125125
fn inspect_container<F>(self, mut func: F) -> OwnedStream<G, C>
126126
where F: FnMut(Result<(&G::Timestamp, &C), &[G::Timestamp]>)+'static

timely/src/dataflow/operators/core/map.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//! Extension methods for `StreamCore` based on record-by-record transformation.
22
33
use crate::container::{Container, SizableContainer, PushInto};
4-
use crate::Data;
54
use crate::dataflow::{OwnedStream, Scope, StreamLike};
65
use crate::dataflow::channels::pact::Pipeline;
76
use crate::dataflow::operators::generic::operator::Operator;
@@ -24,7 +23,7 @@ pub trait Map<G: Scope, C: Container> : Sized {
2423
/// ```
2524
fn map<C2, D2, L>(self, mut logic: L) -> OwnedStream<G, C2>
2625
where
27-
C2: SizableContainer + PushInto<D2> + Data,
26+
C2: SizableContainer + PushInto<D2> + 'static,
2827
L: FnMut(C::Item<'_>)->D2 + 'static,
2928
{
3029
self.flat_map(move |x| std::iter::once(logic(x)))
@@ -46,19 +45,19 @@ pub trait Map<G: Scope, C: Container> : Sized {
4645
fn flat_map<C2, I, L>(self, logic: L) -> OwnedStream<G, C2>
4746
where
4847
I: IntoIterator,
49-
C2: SizableContainer + PushInto<I::Item> + Data,
48+
C2: SizableContainer + PushInto<I::Item> + 'static,
5049
L: FnMut(C::Item<'_>)->I + 'static,
5150
;
5251
}
5352

54-
impl<G: Scope, C: Container + Data, S: StreamLike<G, C>> Map<G, C> for S {
53+
impl<G: Scope, C: Container + 'static, S: StreamLike<G, C>> Map<G, C> for S {
5554
// TODO : This would be more robust if it captured an iterator and then pulled an appropriate
5655
// TODO : number of elements from the iterator. This would allow iterators that produce many
5756
// TODO : records without taking arbitrarily long and arbitrarily much memory.
5857
fn flat_map<C2, I, L>(self, mut logic: L) -> OwnedStream<G, C2>
5958
where
6059
I: IntoIterator,
61-
C2: SizableContainer + PushInto<I::Item> + Data,
60+
C2: SizableContainer + PushInto<I::Item> + 'static,
6261
L: FnMut(C::Item<'_>)->I + 'static,
6362
{
6463
self.unary(Pipeline, "FlatMap", move |_,_| move |input, output| {

timely/src/dataflow/operators/core/ok_err.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//! Operators that separate one stream into two streams based on some condition
22
33
use crate::container::{Container, SizableContainer, PushInto};
4-
use crate::Data;
54
use crate::dataflow::channels::pact::Pipeline;
65
use crate::dataflow::operators::generic::builder_rc::OperatorBuilder;
76
use crate::dataflow::{Scope, OwnedStream, StreamLike};
@@ -30,17 +29,17 @@ pub trait OkErr<S: Scope, C: Container> {
3029
/// ```
3130
fn ok_err<C1, D1, C2, D2, L>(self, logic: L) -> (OwnedStream<S, C1>, OwnedStream<S, C2>)
3231
where
33-
C1: SizableContainer + PushInto<D1> + Data,
34-
C2: SizableContainer + PushInto<D2> + Data,
32+
C1: SizableContainer + PushInto<D1> + 'static,
33+
C2: SizableContainer + PushInto<D2> + 'static,
3534
L: FnMut(C::Item<'_>) -> Result<D1,D2>+'static
3635
;
3736
}
3837

39-
impl<G: Scope, C: Container + Data, S: StreamLike<G, C>> OkErr<G, C> for S {
38+
impl<G: Scope, C: Container + 'static, S: StreamLike<G, C>> OkErr<G, C> for S {
4039
fn ok_err<C1, D1, C2, D2, L>(self, mut logic: L) -> (OwnedStream<G, C1>, OwnedStream<G, C2>)
4140
where
42-
C1: SizableContainer + PushInto<D1> + Data,
43-
C2: SizableContainer + PushInto<D2> + Data,
41+
C1: SizableContainer + PushInto<D1> + 'static,
42+
C2: SizableContainer + PushInto<D2> + 'static,
4443
L: FnMut(C::Item<'_>) -> Result<D1,D2>+'static
4544
{
4645
let mut builder = OperatorBuilder::new("OkErr".to_owned(), self.scope());

timely/src/dataflow/operators/core/probe.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@ use crate::dataflow::channels::pushers::buffer::Buffer as PushBuffer;
1010
use crate::dataflow::channels::pact::Pipeline;
1111
use crate::dataflow::channels::pullers::Counter as PullCounter;
1212
use crate::dataflow::operators::generic::builder_raw::OperatorBuilder;
13-
14-
1513
use crate::dataflow::{Scope, OwnedStream, StreamLike};
16-
use crate::{Container, Data};
14+
use crate::Container;
1715

1816
/// Monitors progress at a `Stream`.
1917
pub trait Probe<G: Scope, C: Container> {
@@ -79,7 +77,7 @@ pub trait Probe<G: Scope, C: Container> {
7977
fn probe_with(self, handle: &Handle<G::Timestamp>) -> OwnedStream<G, C>;
8078
}
8179

82-
impl<G: Scope, C: Container + Data, S: StreamLike<G, C>> Probe<G, C> for S {
80+
impl<G: Scope, C: Container + 'static, S: StreamLike<G, C>> Probe<G, C> for S {
8381
fn probe(self) -> Handle<G::Timestamp> {
8482

8583
// the frontier is shared state; scope updates, handle reads.

0 commit comments

Comments
 (0)