Skip to content

Commit cb41e11

Browse files
committed
Owned streams take 2
Signed-off-by: Moritz Hoffmann <[email protected]>
1 parent f2ea960 commit cb41e11

29 files changed

+108
-107
lines changed

timely/examples/bfs.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ fn main() {
4848

4949
// use the stream of edges
5050
graph.binary_notify(
51-
&stream,
51+
stream,
5252
Exchange::new(|x: &(u32, u32)| u64::from(x.0)),
5353
Exchange::new(|x: &(u32, u32)| u64::from(x.0)),
5454
"BFS",

timely/examples/hashjoin.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ fn main() {
3535
let exchange2 = Exchange::new(|x: &(u64, u64)| x.0);
3636

3737
stream1
38-
.binary(&stream2, exchange1, exchange2, "HashJoin", |_capability, _info| {
38+
.binary(stream2, exchange1, exchange2, "HashJoin", |_capability, _info| {
3939

4040
let mut map1 = HashMap::<u64, Vec<u64>>::new();
4141
let mut map2 = HashMap::<u64, Vec<u64>>::new();

timely/examples/loopdemo.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ fn main() {
3232
.concat(&loop_stream)
3333
.map(|x| if x % 2 == 0 { x / 2 } else { 3 * x + 1 })
3434
.filter(|x| x > &1);
35-
36-
step.connect_loop(loop_handle);
37-
step.probe_with(&mut probe);
35+
step
36+
.probe_with(&mut probe)
37+
.connect_loop(loop_handle);
3838
});
3939

4040
let ns_per_request = 1_000_000_000 / rate;
@@ -122,4 +122,4 @@ fn main() {
122122
}
123123

124124
}).unwrap();
125-
}
125+
}

timely/examples/pagerank.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ fn main() {
2626

2727
// bring edges and ranks together!
2828
let changes = edge_stream.binary_frontier(
29-
&rank_stream,
29+
rank_stream,
3030
Exchange::new(|x: &((usize, usize), i64)| (x.0).0 as u64),
3131
Exchange::new(|x: &(usize, i64)| x.0 as u64),
3232
"PageRank",

timely/examples/unionfind.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ fn main() {
5151
}
5252

5353
trait UnionFind {
54-
fn union_find(&self) -> Self;
54+
fn union_find(self) -> Self;
5555
}
5656

5757
impl<G: Scope> UnionFind for Stream<G, (usize, usize)> {
58-
fn union_find(&self) -> Stream<G, (usize, usize)> {
58+
fn union_find(self) -> Stream<G, (usize, usize)> {
5959

6060
self.unary(Pipeline, "UnionFind", |_,_| {
6161

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ pub trait Aggregate<S: Scope, K: ExchangeData+Hash, V: ExchangeData> {
6161
/// });
6262
/// ```
6363
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>(
64-
&self,
64+
self,
6565
fold: F,
6666
emit: E,
6767
hash: H) -> Stream<S, R> where S::Timestamp: Eq;
@@ -70,7 +70,7 @@ pub trait Aggregate<S: Scope, K: ExchangeData+Hash, V: ExchangeData> {
7070
impl<S: Scope, K: ExchangeData+Hash+Eq, V: ExchangeData> Aggregate<S, K, V> for Stream<S, (K, V)> {
7171

7272
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>(
73-
&self,
73+
self,
7474
fold: F,
7575
emit: E,
7676
hash: H) -> Stream<S, R> where S::Timestamp: Eq {

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ pub trait StateMachine<S: Scope, K: ExchangeData+Hash+Eq, V: ExchangeData> {
5151
I: IntoIterator<Item=R>, // type of output iterator
5252
F: Fn(&K, V, &mut D)->(bool, I)+'static, // state update logic
5353
H: Fn(&K)->u64+'static, // "hash" function for keys
54-
>(&self, fold: F, hash: H) -> Stream<S, R> where S::Timestamp : Hash+Eq ;
54+
>(self, fold: F, hash: H) -> Stream<S, R> where S::Timestamp : Hash+Eq ;
5555
}
5656

5757
impl<S: Scope, K: ExchangeData+Hash+Eq, V: ExchangeData> StateMachine<S, K, V> for Stream<S, (K, V)> {
@@ -61,7 +61,7 @@ impl<S: Scope, K: ExchangeData+Hash+Eq, V: ExchangeData> StateMachine<S, K, V> f
6161
I: IntoIterator<Item=R>, // type of output iterator
6262
F: Fn(&K, V, &mut D)->(bool, I)+'static, // state update logic
6363
H: Fn(&K)->u64+'static, // "hash" function for keys
64-
>(&self, fold: F, hash: H) -> Stream<S, R> where S::Timestamp : Hash+Eq {
64+
>(self, fold: F, hash: H) -> Stream<S, R> where S::Timestamp : Hash+Eq {
6565

6666
let mut pending: HashMap<_, Vec<(K, V)>> = HashMap::new(); // times -> (keys -> state)
6767
let mut states = HashMap::new(); // keys -> state

timely/src/dataflow/operators/branch.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ pub trait Branch<S: Scope, D: Data> {
2929
/// });
3030
/// ```
3131
fn branch(
32-
&self,
32+
self,
3333
condition: impl Fn(&S::Timestamp, &D) -> bool + 'static,
3434
) -> (Stream<S, D>, Stream<S, D>);
3535
}
3636

3737
impl<S: Scope, D: Data> Branch<S, D> for Stream<S, D> {
3838
fn branch(
39-
&self,
39+
self,
4040
condition: impl Fn(&S::Timestamp, &D) -> bool + 'static,
4141
) -> (Stream<S, D>, Stream<S, D>) {
4242
let mut builder = OperatorBuilder::new("Branch".to_owned(), self.scope());
@@ -91,11 +91,11 @@ pub trait BranchWhen<T>: Sized {
9191
/// after_five.inspect(|x| println!("Times 5 and later: {:?}", x));
9292
/// });
9393
/// ```
94-
fn branch_when(&self, condition: impl Fn(&T) -> bool + 'static) -> (Self, Self);
94+
fn branch_when(self, condition: impl Fn(&T) -> bool + 'static) -> (Self, Self);
9595
}
9696

9797
impl<S: Scope, C: Container> BranchWhen<S::Timestamp> for StreamCore<S, C> {
98-
fn branch_when(&self, condition: impl Fn(&S::Timestamp) -> bool + 'static) -> (Self, Self) {
98+
fn branch_when(self, condition: impl Fn(&S::Timestamp) -> bool + 'static) -> (Self, Self) {
9999
let mut builder = OperatorBuilder::new("Branch".to_owned(), self.scope());
100100

101101
let mut input = builder.new_input(self, Pipeline);

timely/src/dataflow/operators/broadcast.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ pub trait Broadcast<D: ExchangeData> {
1818
/// .inspect(|x| println!("seen: {:?}", x));
1919
/// });
2020
/// ```
21-
fn broadcast(&self) -> Self;
21+
fn broadcast(self) -> Self;
2222
}
2323

2424
impl<G: Scope, D: ExchangeData> Broadcast<D> for Stream<G, D> {
25-
fn broadcast(&self) -> Stream<G, D> {
25+
fn broadcast(self) -> Stream<G, D> {
2626

2727
// NOTE: Simplified implementation due to underlying motion
2828
// in timely dataflow internals. Optimize once they have

timely/src/dataflow/operators/capture/capture.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::progress::Timestamp;
1717
use super::{EventCore, EventPusherCore};
1818

1919
/// Capture a stream of timestamped data for later replay.
20-
pub trait Capture<T: Timestamp, D: Container> {
20+
pub trait Capture<T: Timestamp, D: Container>: Sized {
2121
/// Captures a stream of timestamped data for later replay.
2222
///
2323
/// # Examples
@@ -103,18 +103,18 @@ pub trait Capture<T: Timestamp, D: Container> {
103103
///
104104
/// assert_eq!(recv0.extract()[0].1, (0..10).collect::<Vec<_>>());
105105
/// ```
106-
fn capture_into<P: EventPusherCore<T, D>+'static>(&self, pusher: P);
106+
fn capture_into<P: EventPusherCore<T, D>+'static>(self, pusher: P);
107107

108108
/// Captures a stream using Rust's MPSC channels.
109-
fn capture(&self) -> ::std::sync::mpsc::Receiver<EventCore<T, D>> {
109+
fn capture(self) -> ::std::sync::mpsc::Receiver<EventCore<T, D>> {
110110
let (send, recv) = ::std::sync::mpsc::channel();
111111
self.capture_into(send);
112112
recv
113113
}
114114
}
115115

116116
impl<S: Scope, D: Container> Capture<S::Timestamp, D> for StreamCore<S, D> {
117-
fn capture_into<P: EventPusherCore<S::Timestamp, D>+'static>(&self, mut event_pusher: P) {
117+
fn capture_into<P: EventPusherCore<S::Timestamp, D>+'static>(self, mut event_pusher: P) {
118118

119119
let mut builder = OperatorBuilder::new("Capture".to_owned(), self.scope());
120120
let mut input = PullCounter::new(builder.new_input(self, Pipeline));

timely/src/dataflow/operators/concat.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ impl<G: Scope, D: Container> Concatenate<G, D> for G {
7373
let mut builder = OperatorBuilder::new("Concatenate".to_string(), self.clone());
7474

7575
// create new input handles for each input stream.
76-
let mut handles = sources.into_iter().map(|s| builder.new_input(&s, Pipeline)).collect::<Vec<_>>();
76+
let mut handles = sources.into_iter().map(|s| builder.new_input(s, Pipeline)).collect::<Vec<_>>();
7777

7878
// create one output handle for the concatenated results.
7979
let (mut output, result) = builder.new_output();

timely/src/dataflow/operators/count.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::dataflow::{Stream, Scope};
99
use crate::dataflow::operators::generic::operator::Operator;
1010

1111
/// Accumulates records within a timestamp.
12-
pub trait Accumulate<G: Scope, D: Data> {
12+
pub trait Accumulate<G: Scope, D: Data>: Sized {
1313
/// Accumulates records within a timestamp.
1414
///
1515
/// # Examples
@@ -27,7 +27,7 @@ pub trait Accumulate<G: Scope, D: Data> {
2727
/// let extracted = captured.extract();
2828
/// assert_eq!(extracted, vec![(0, vec![45])]);
2929
/// ```
30-
fn accumulate<A: Data>(&self, default: A, logic: impl Fn(&mut A, RefOrMut<Vec<D>>)+'static) -> Stream<G, A>;
30+
fn accumulate<A: Data>(self, default: A, logic: impl Fn(&mut A, RefOrMut<Vec<D>>)+'static) -> Stream<G, A>;
3131
/// Counts the number of records observed at each time.
3232
///
3333
/// # Examples
@@ -45,13 +45,13 @@ pub trait Accumulate<G: Scope, D: Data> {
4545
/// let extracted = captured.extract();
4646
/// assert_eq!(extracted, vec![(0, vec![10])]);
4747
/// ```
48-
fn count(&self) -> Stream<G, usize> {
48+
fn count(self) -> Stream<G, usize> {
4949
self.accumulate(0, |sum, data| *sum += data.len())
5050
}
5151
}
5252

5353
impl<G: Scope, D: Data> Accumulate<G, D> for Stream<G, D> {
54-
fn accumulate<A: Data>(&self, default: A, logic: impl Fn(&mut A, RefOrMut<Vec<D>>)+'static) -> Stream<G, A> {
54+
fn accumulate<A: Data>(self, default: A, logic: impl Fn(&mut A, RefOrMut<Vec<D>>)+'static) -> Stream<G, A> {
5555

5656
let mut accums = HashMap::new();
5757
self.unary_notify(Pipeline, "Accumulate", vec![], move |input, output, notificator| {

timely/src/dataflow/operators/delay.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ pub trait Delay<G: Scope, D: Data> {
3636
/// });
3737
/// });
3838
/// ```
39-
fn delay<L: FnMut(&D, &G::Timestamp)->G::Timestamp+'static>(&self, func: L) -> Self;
39+
fn delay<L: FnMut(&D, &G::Timestamp)->G::Timestamp+'static>(self, func: L) -> Self;
4040

4141
/// Advances the timestamp of records using a supplied function.
4242
///
@@ -63,7 +63,7 @@ pub trait Delay<G: Scope, D: Data> {
6363
/// });
6464
/// });
6565
/// ```
66-
fn delay_total<L: FnMut(&D, &G::Timestamp)->G::Timestamp+'static>(&self, func: L) -> Self
66+
fn delay_total<L: FnMut(&D, &G::Timestamp)->G::Timestamp+'static>(self, func: L) -> Self
6767
where G::Timestamp: TotalOrder;
6868

6969
/// Advances the timestamp of batches of records using a supplied function.
@@ -91,11 +91,11 @@ pub trait Delay<G: Scope, D: Data> {
9191
/// });
9292
/// });
9393
/// ```
94-
fn delay_batch<L: FnMut(&G::Timestamp)->G::Timestamp+'static>(&self, func: L) -> Self;
94+
fn delay_batch<L: FnMut(&G::Timestamp)->G::Timestamp+'static>(self, func: L) -> Self;
9595
}
9696

9797
impl<G: Scope, D: Data> Delay<G, D> for Stream<G, D> {
98-
fn delay<L: FnMut(&D, &G::Timestamp)->G::Timestamp+'static>(&self, mut func: L) -> Self {
98+
fn delay<L: FnMut(&D, &G::Timestamp)->G::Timestamp+'static>(self, mut func: L) -> Self {
9999
let mut elements = HashMap::new();
100100
let mut vector = Vec::new();
101101
self.unary_notify(Pipeline, "Delay", vec![], move |input, output, notificator| {
@@ -119,13 +119,13 @@ impl<G: Scope, D: Data> Delay<G, D> for Stream<G, D> {
119119
})
120120
}
121121

122-
fn delay_total<L: FnMut(&D, &G::Timestamp)->G::Timestamp+'static>(&self, func: L) -> Self
122+
fn delay_total<L: FnMut(&D, &G::Timestamp)->G::Timestamp+'static>(self, func: L) -> Self
123123
where G::Timestamp: TotalOrder
124124
{
125125
self.delay(func)
126126
}
127127

128-
fn delay_batch<L: FnMut(&G::Timestamp)->G::Timestamp+'static>(&self, mut func: L) -> Self {
128+
fn delay_batch<L: FnMut(&G::Timestamp)->G::Timestamp+'static>(self, mut func: L) -> Self {
129129
let mut elements = HashMap::new();
130130
self.unary_notify(Pipeline, "Delay", vec![], move |input, output, notificator| {
131131
input.for_each(|time, data| {

timely/src/dataflow/operators/enterleave.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ pub trait Enter<G: Scope, T: Timestamp+Refines<G::Timestamp>, C: Container> {
5151
/// });
5252
/// });
5353
/// ```
54-
fn enter<'a>(&self, _: &Child<'a, G, T>) -> StreamCore<Child<'a, G, T>, C>;
54+
fn enter<'a>(self, _: &Child<'a, G, T>) -> StreamCore<Child<'a, G, T>, C>;
5555
}
5656

5757
use crate::dataflow::scopes::child::Iterative;
@@ -72,18 +72,18 @@ pub trait EnterAt<G: Scope, T: Timestamp, D: Data> {
7272
/// });
7373
/// });
7474
/// ```
75-
fn enter_at<'a, F:FnMut(&D)->T+'static>(&self, scope: &Iterative<'a, G, T>, initial: F) -> Stream<Iterative<'a, G, T>, D> ;
75+
fn enter_at<'a, F:FnMut(&D)->T+'static>(self, scope: &Iterative<'a, G, T>, initial: F) -> Stream<Iterative<'a, G, T>, D> ;
7676
}
7777

7878
impl<G: Scope, T: Timestamp, D: Data, E: Enter<G, Product<<G as ScopeParent>::Timestamp, T>, Vec<D>>> EnterAt<G, T, D> for E {
79-
fn enter_at<'a, F:FnMut(&D)->T+'static>(&self, scope: &Iterative<'a, G, T>, mut initial: F) ->
79+
fn enter_at<'a, F:FnMut(&D)->T+'static>(self, scope: &Iterative<'a, G, T>, mut initial: F) ->
8080
Stream<Iterative<'a, G, T>, D> {
8181
self.enter(scope).delay(move |datum, time| Product::new(time.clone().to_outer(), initial(datum)))
8282
}
8383
}
8484

8585
impl<G: Scope, T: Timestamp+Refines<G::Timestamp>, C: Data+Container> Enter<G, T, C> for StreamCore<G, C> {
86-
fn enter<'a>(&self, scope: &Child<'a, G, T>) -> StreamCore<Child<'a, G, T>, C> {
86+
fn enter<'a>(self, scope: &Child<'a, G, T>) -> StreamCore<Child<'a, G, T>, C> {
8787

8888
use crate::scheduling::Scheduler;
8989

@@ -120,11 +120,11 @@ pub trait Leave<G: Scope, D: Container> {
120120
/// });
121121
/// });
122122
/// ```
123-
fn leave(&self) -> StreamCore<G, D>;
123+
fn leave(self) -> StreamCore<G, D>;
124124
}
125125

126126
impl<'a, G: Scope, D: Clone+Container, T: Timestamp+Refines<G::Timestamp>> Leave<G, D> for StreamCore<Child<'a, G, T>, D> {
127-
fn leave(&self) -> StreamCore<G, D> {
127+
fn leave(self) -> StreamCore<G, D> {
128128

129129
let scope = self.scope();
130130

timely/src/dataflow/operators/exchange.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@ pub trait Exchange<D> {
2323
/// .inspect(|x| println!("seen: {:?}", x));
2424
/// });
2525
/// ```
26-
fn exchange(&self, route: impl FnMut(&D) -> u64 + 'static) -> Self;
26+
fn exchange(self, route: impl FnMut(&D) -> u64 + 'static) -> Self;
2727
}
2828

2929
impl<G: Scope, C> Exchange<C::Item> for StreamCore<G, C>
3030
where
3131
C: PushPartitioned + ExchangeData,
3232
C::Item: ExchangeData,
3333
{
34-
fn exchange(&self, route: impl FnMut(&C::Item) -> u64 + 'static) -> StreamCore<G, C> {
34+
fn exchange(self, route: impl FnMut(&C::Item) -> u64 + 'static) -> StreamCore<G, C> {
3535
let mut container = Default::default();
3636
self.unary(ExchangeCore::new(route), "Exchange", |_, _| {
3737
move |input, output| {

timely/src/dataflow/operators/feedback.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,11 @@ pub trait ConnectLoop<G: Scope, D: Container> {
129129
/// .connect_loop(handle);
130130
/// });
131131
/// ```
132-
fn connect_loop(&self, _: HandleCore<G, D>);
132+
fn connect_loop(self, _: HandleCore<G, D>);
133133
}
134134

135135
impl<G: Scope, D: Container> ConnectLoop<G, D> for StreamCore<G, D> {
136-
fn connect_loop(&self, helper: HandleCore<G, D>) {
136+
fn connect_loop(self, helper: HandleCore<G, D>) {
137137

138138
let mut builder = helper.builder;
139139
let summary = helper.summary;

timely/src/dataflow/operators/filter.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ pub trait Filter<D: Data> {
1919
/// .inspect(|x| println!("seen: {:?}", x));
2020
/// });
2121
/// ```
22-
fn filter<P: FnMut(&D)->bool+'static>(&self, predicate: P) -> Self;
22+
fn filter<P: FnMut(&D)->bool+'static>(self, predicate: P) -> Self;
2323
}
2424

2525
impl<G: Scope, D: Data> Filter<D> for Stream<G, D> {
26-
fn filter<P: FnMut(&D)->bool+'static>(&self, mut predicate: P) -> Stream<G, D> {
26+
fn filter<P: FnMut(&D)->bool+'static>(self, mut predicate: P) -> Stream<G, D> {
2727
let mut vector = Vec::new();
2828
self.unary(Pipeline, "Filter", move |_,_| move |input, output| {
2929
input.for_each(|time, data| {

timely/src/dataflow/operators/generic/builder_raw.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,15 @@ impl<G: Scope> OperatorBuilder<G> {
105105
}
106106

107107
/// Adds a new input to a generic operator builder, returning the `Pull` implementor to use.
108-
pub fn new_input<D: Container, P>(&mut self, stream: &StreamCore<G, D>, pact: P) -> P::Puller
108+
pub fn new_input<D: Container, P>(&mut self, stream: StreamCore<G, D>, pact: P) -> P::Puller
109109
where
110110
P: ParallelizationContractCore<G::Timestamp, D> {
111111
let connection = vec![Antichain::from_elem(Default::default()); self.shape.outputs];
112112
self.new_input_connection(stream, pact, connection)
113113
}
114114

115115
/// Adds a new input to a generic operator builder, returning the `Pull` implementor to use.
116-
pub fn new_input_connection<D: Container, P>(&mut self, stream: &StreamCore<G, D>, pact: P, connection: Vec<Antichain<<G::Timestamp as Timestamp>::Summary>>) -> P::Puller
116+
pub fn new_input_connection<D: Container, P>(&mut self, stream: StreamCore<G, D>, pact: P, connection: Vec<Antichain<<G::Timestamp as Timestamp>::Summary>>) -> P::Puller
117117
where
118118
P: ParallelizationContractCore<G::Timestamp, D> {
119119

timely/src/dataflow/operators/generic/builder_rc.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ impl<G: Scope> OperatorBuilder<G> {
5959
}
6060

6161
/// Adds a new input to a generic operator builder, returning the `Pull` implementor to use.
62-
pub fn new_input<D: Container, P>(&mut self, stream: &StreamCore<G, D>, pact: P) -> InputHandleCore<G::Timestamp, D, P::Puller>
62+
pub fn new_input<D: Container, P>(&mut self, stream: StreamCore<G, D>, pact: P) -> InputHandleCore<G::Timestamp, D, P::Puller>
6363
where
6464
P: ParallelizationContractCore<G::Timestamp, D> {
6565

@@ -75,7 +75,7 @@ impl<G: Scope> OperatorBuilder<G> {
7575
///
7676
/// Commonly the connections are either the unit summary, indicating the same timestamp might be produced as output, or an empty
7777
/// antichain indicating that there is no connection from the input to the output.
78-
pub fn new_input_connection<D: Container, P>(&mut self, stream: &StreamCore<G, D>, pact: P, connection: Vec<Antichain<<G::Timestamp as Timestamp>::Summary>>) -> InputHandleCore<G::Timestamp, D, P::Puller>
78+
pub fn new_input_connection<D: Container, P>(&mut self, stream: StreamCore<G, D>, pact: P, connection: Vec<Antichain<<G::Timestamp as Timestamp>::Summary>>) -> InputHandleCore<G::Timestamp, D, P::Puller>
7979
where
8080
P: ParallelizationContractCore<G::Timestamp, D> {
8181

0 commit comments

Comments
 (0)