diff --git a/dogsdogsdogs/src/operators/count.rs b/dogsdogsdogs/src/operators/count.rs index 1cc193d66..8382d631c 100644 --- a/dogsdogsdogs/src/operators/count.rs +++ b/dogsdogsdogs/src/operators/count.rs @@ -19,9 +19,8 @@ pub fn count( index: usize, ) -> Collection where - G: Scope, - G::Timestamp: Lattice, - Tr: TraceReader+Clone+'static, + G: Scope, + Tr: TraceReader+Clone+'static, Tr::KeyOwned: Hashable + Default, R: Monoid+Multiply+ExchangeData, F: Fn(&P)->Tr::KeyOwned+Clone+'static, diff --git a/dogsdogsdogs/src/operators/half_join.rs b/dogsdogsdogs/src/operators/half_join.rs index 0f5b90509..9d1f6114f 100644 --- a/dogsdogsdogs/src/operators/half_join.rs +++ b/dogsdogsdogs/src/operators/half_join.rs @@ -76,13 +76,11 @@ pub fn half_join( mut output_func: S, ) -> Collection>::Output> where - G: Scope, - G::Timestamp: Lattice, - Tr::KeyOwned: Ord + Hashable + ExchangeData, + G: Scope, + Tr::KeyOwned: Hashable + ExchangeData, V: ExchangeData, R: ExchangeData + Monoid, - Tr: TraceReader+Clone+'static, - Tr::Diff: Semigroup, + Tr: TraceReader+Clone+'static, R: Mul, >::Output: Semigroup, FF: Fn(&G::Timestamp) -> G::Timestamp + 'static, @@ -131,13 +129,11 @@ pub fn half_join_internal_unsafe( mut output_func: S, ) -> Collection where - G: Scope, - G::Timestamp: Lattice, - Tr::KeyOwned: Ord + Hashable + ExchangeData, + G: Scope, + Tr::KeyOwned: Hashable + ExchangeData, V: ExchangeData, R: ExchangeData + Monoid, - Tr: TraceReader+Clone+'static, - Tr::Diff: Semigroup, + Tr: TraceReader+Clone+'static, FF: Fn(&G::Timestamp) -> G::Timestamp + 'static, CF: Fn(&G::Timestamp, &G::Timestamp) -> bool + 'static, DOut: Clone+'static, diff --git a/dogsdogsdogs/src/operators/lookup_map.rs b/dogsdogsdogs/src/operators/lookup_map.rs index 0704fecb1..a069c9d23 100644 --- a/dogsdogsdogs/src/operators/lookup_map.rs +++ b/dogsdogsdogs/src/operators/lookup_map.rs @@ -27,9 +27,8 @@ pub fn lookup_map( supplied_key2: Tr::KeyOwned, ) -> Collection where - G: Scope, - G::Timestamp: Lattice, - Tr: TraceReader+Clone+'static, + G: Scope, + Tr: TraceReader+Clone+'static, Tr::KeyOwned: Hashable, Tr::Diff: Monoid+ExchangeData, F: FnMut(&D, &mut Tr::KeyOwned)+Clone+'static, diff --git a/dogsdogsdogs/src/operators/propose.rs b/dogsdogsdogs/src/operators/propose.rs index 1434963f1..cca4ee975 100644 --- a/dogsdogsdogs/src/operators/propose.rs +++ b/dogsdogsdogs/src/operators/propose.rs @@ -21,9 +21,8 @@ pub fn propose( key_selector: F, ) -> Collection where - G: Scope, - G::Timestamp: Lattice, - Tr: TraceReader+Clone+'static, + G: Scope, + Tr: TraceReader+Clone+'static, Tr::KeyOwned: Hashable + Default, Tr::Diff: Monoid+Multiply+ExchangeData, F: Fn(&P)->Tr::KeyOwned+Clone+'static, @@ -51,9 +50,8 @@ pub fn propose_distinct( key_selector: F, ) -> Collection where - G: Scope, - G::Timestamp: Lattice, - Tr: TraceReader+Clone+'static, + G: Scope, + Tr: TraceReader+Clone+'static, Tr::KeyOwned: Hashable + Default, Tr::Diff: Monoid+Multiply+ExchangeData, F: Fn(&P)->Tr::KeyOwned+Clone+'static, diff --git a/dogsdogsdogs/src/operators/validate.rs b/dogsdogsdogs/src/operators/validate.rs index 2d1e8f371..ec347b386 100644 --- a/dogsdogsdogs/src/operators/validate.rs +++ b/dogsdogsdogs/src/operators/validate.rs @@ -19,9 +19,8 @@ pub fn validate( key_selector: F, ) -> Collection where - G: Scope, - G::Timestamp: Lattice, - Tr: TraceReader+Clone+'static, + G: Scope, + Tr: TraceReader+Clone+'static, K: Ord+Hash+Clone+Default, V: ExchangeData+Hash+Default, Tr::Diff: Monoid+Multiply+ExchangeData, diff --git a/examples/cursors.rs b/examples/cursors.rs index 120c6a55d..a9632570c 100644 --- a/examples/cursors.rs +++ b/examples/cursors.rs @@ -132,10 +132,10 @@ fn main() { fn dump_cursor(round: u32, index: usize, trace: &mut Tr) where Tr: TraceReader, - Tr::KeyOwned: Debug + Clone, - Tr::ValOwned: Debug + Clone, - Tr::Time: Debug + Clone, - Tr::Diff: Debug + Clone, + Tr::KeyOwned: Debug, + Tr::ValOwned: Debug, + Tr::Time: Debug, + Tr::Diff: Debug, { let (mut cursor, storage) = trace.cursor(); for ((k, v), diffs) in cursor.to_vec(&storage).iter() { diff --git a/src/algorithms/graphs/bfs.rs b/src/algorithms/graphs/bfs.rs index 31fa6978a..2211a5276 100644 --- a/src/algorithms/graphs/bfs.rs +++ b/src/algorithms/graphs/bfs.rs @@ -26,10 +26,9 @@ use crate::operators::arrange::Arranged; /// Returns pairs (node, dist) indicating distance of each node from a root. pub fn bfs_arranged(edges: &Arranged, roots: &Collection) -> Collection where - G: Scope, - G::Timestamp: Lattice+Ord, + G: Scope, N: ExchangeData+Hash, - Tr: for<'a> TraceReader=&'a N, Val<'a>=&'a N, Time=G::Timestamp, Diff=isize>+Clone+'static, + Tr: for<'a> TraceReader=&'a N, Val<'a>=&'a N, Diff=isize>+Clone+'static, { // initialize roots as reaching themselves at distance 0 let nodes = roots.map(|x| (x, 0)); diff --git a/src/algorithms/graphs/bijkstra.rs b/src/algorithms/graphs/bijkstra.rs index 3c16595dd..7dc11c1d9 100644 --- a/src/algorithms/graphs/bijkstra.rs +++ b/src/algorithms/graphs/bijkstra.rs @@ -42,10 +42,9 @@ pub fn bidijkstra_arranged( goals: &Collection ) -> Collection where - G: Scope, - G::Timestamp: Lattice+Ord, + G: Scope, N: ExchangeData+Hash, - Tr: for<'a> TraceReader=&'a N, Val<'a>=&'a N, Time=G::Timestamp, Diff=isize>+Clone+'static, + Tr: for<'a> TraceReader=&'a N, Val<'a>=&'a N, Diff=isize>+Clone+'static, { forward .stream diff --git a/src/algorithms/graphs/propagate.rs b/src/algorithms/graphs/propagate.rs index 4b8f1a9e1..9aef8e08b 100644 --- a/src/algorithms/graphs/propagate.rs +++ b/src/algorithms/graphs/propagate.rs @@ -56,14 +56,13 @@ use crate::operators::arrange::arrangement::Arranged; /// of `logic should be a number in the interval [0,64], pub fn propagate_core(edges: &Arranged, nodes: &Collection, logic: F) -> Collection where - G: Scope, - G::Timestamp: Lattice+Ord, + G: Scope, N: ExchangeData+Hash, R: ExchangeData+Abelian, R: Multiply, R: From, L: ExchangeData, - Tr: for<'a> TraceReader=&'a N, Val<'a>=&'a N, Time=G::Timestamp, Diff=R>+Clone+'static, + Tr: for<'a> TraceReader=&'a N, Val<'a>=&'a N, Diff=R>+Clone+'static, F: Fn(&L)->u64+Clone+'static, { // Morally the code performs the following iterative computation. However, in the interest of a simplified diff --git a/src/operators/arrange/agent.rs b/src/operators/arrange/agent.rs index d1bac4fc5..c18b7e30e 100644 --- a/src/operators/arrange/agent.rs +++ b/src/operators/arrange/agent.rs @@ -10,7 +10,6 @@ use timely::progress::Timestamp; use timely::progress::{Antichain, frontier::AntichainRef}; use timely::dataflow::operators::CapabilitySet; -use crate::lattice::Lattice; use crate::trace::{Trace, TraceReader, Batch, BatchReader}; use crate::trace::wrappers::rc::TraceBox; @@ -29,7 +28,6 @@ use crate::trace::wrappers::frontier::{TraceFrontier, BatchFrontier}; pub struct TraceAgent where Tr: TraceReader, - Tr::Time: Lattice+Ord+Clone+'static, { trace: Rc>>, queues: Weak>>>, @@ -44,7 +42,6 @@ where impl TraceReader for TraceAgent where Tr: TraceReader, - Tr::Time: Lattice+Ord+Clone+'static, { type Key<'a> = Tr::Key<'a>; type KeyOwned = Tr::KeyOwned; @@ -85,11 +82,7 @@ where fn map_batches(&self, f: F) { self.trace.borrow().trace.map_batches(f) } } -impl TraceAgent -where - Tr: TraceReader, - Tr::Time: Timestamp+Lattice, -{ +impl TraceAgent { /// Creates a new agent from a trace reader. pub fn new(trace: Tr, operator: OperatorInfo, logging: Option) -> (Self, TraceWriter) where @@ -177,7 +170,6 @@ where impl TraceAgent where Tr: TraceReader+'static, - Tr::Time: Lattice+Ord+Clone+'static, { /// Copies an existing collection into the supplied scope. /// @@ -233,7 +225,6 @@ where pub fn import(&mut self, scope: &G) -> Arranged> where G: Scope, - Tr::Time: Timestamp, { self.import_named(scope, "ArrangedSource") } @@ -242,7 +233,6 @@ where pub fn import_named(&mut self, scope: &G, name: &str) -> Arranged> where G: Scope, - Tr::Time: Timestamp, { // Drop ShutdownButton and return only the arrangement. self.import_core(scope, name).0 @@ -300,7 +290,6 @@ where pub fn import_core(&mut self, scope: &G, name: &str) -> (Arranged>, ShutdownButton>) where G: Scope, - Tr::Time: Timestamp, { let trace = self.clone(); @@ -418,7 +407,6 @@ where pub fn import_frontier(&mut self, scope: &G, name: &str) -> (Arranged>>, ShutdownButton>) where G: Scope, - Tr::Time: Timestamp+ Lattice+Ord+Clone+'static, Tr: TraceReader, { // This frontier describes our only guarantee on the compaction frontier. @@ -437,7 +425,6 @@ where pub fn import_frontier_core(&mut self, scope: &G, name: &str, since: Antichain, until: Antichain) -> (Arranged>>, ShutdownButton>) where G: Scope, - Tr::Time: Timestamp+ Lattice+Ord+Clone+'static, Tr: TraceReader, { let trace = self.clone(); @@ -541,7 +528,6 @@ impl Drop for ShutdownDeadmans { impl Clone for TraceAgent where Tr: TraceReader, - Tr::Time: Lattice+Ord+Clone+'static, { fn clone(&self) -> Self { @@ -571,7 +557,6 @@ where impl Drop for TraceAgent where Tr: TraceReader, - Tr::Time: Lattice+Ord+Clone+'static, { fn drop(&mut self) { diff --git a/src/operators/arrange/arrangement.rs b/src/operators/arrange/arrangement.rs index 6f640074b..788a8405c 100644 --- a/src/operators/arrange/arrangement.rs +++ b/src/operators/arrange/arrangement.rs @@ -18,7 +18,7 @@ //! commit only completed data to the trace). use timely::dataflow::operators::{Enter, Map}; -use timely::order::{PartialOrder, TotalOrder}; +use timely::order::PartialOrder; use timely::dataflow::{Scope, Stream}; use timely::dataflow::operators::generic::Operator; use timely::dataflow::channels::pact::{ParallelizationContract, Pipeline, Exchange}; @@ -62,10 +62,10 @@ where // returns when invoked, so as to not duplicate work with multiple calls to `as_collection`. } -impl Clone for Arranged +impl Clone for Arranged where - G::Timestamp: Lattice+Ord, - Tr: TraceReader + Clone, + G: Scope, + Tr: TraceReader + Clone, { fn clone(&self) -> Self { Arranged { @@ -78,10 +78,10 @@ where use ::timely::dataflow::scopes::Child; use ::timely::progress::timestamp::Refines; -impl Arranged +impl Arranged where - G::Timestamp: Lattice+Ord, - Tr: TraceReader + Clone, + G: Scope, + Tr: TraceReader + Clone, { /// Brings an arranged collection into a nested scope. /// @@ -91,9 +91,7 @@ where pub fn enter<'a, TInner>(&self, child: &Child<'a, G, TInner>) -> Arranged, TraceEnter> where - Tr::Diff: 'static, - G::Timestamp: Clone+'static, - TInner: Refines+Lattice+Timestamp+Clone+'static, + TInner: Refines+Lattice+Timestamp+Clone, { Arranged { stream: self.stream.enter(child).map(|bw| BatchEnter::make_from(bw)), @@ -106,11 +104,7 @@ where /// This method only applies to *regions*, which are subscopes with the same timestamp /// as their containing scope. In this case, the trace type does not need to change. pub fn enter_region<'a>(&self, child: &Child<'a, G, G::Timestamp>) - -> Arranged, Tr> - where - Tr::Diff: 'static, - G::Timestamp: Clone+'static, - { + -> Arranged, Tr> { Arranged { stream: self.stream.enter(child), trace: self.trace.clone(), @@ -125,8 +119,6 @@ where pub fn enter_at<'a, TInner, F, P>(&self, child: &Child<'a, G, TInner>, logic: F, prior: P) -> Arranged, TraceEnterAt> where - Tr::Diff: 'static, - G::Timestamp: Clone+'static, TInner: Refines+Lattice+Timestamp+Clone+'static, F: FnMut(Tr::Key<'_>, Tr::Val<'_>, &G::Timestamp)->TInner+Clone+'static, P: FnMut(&TInner)->Tr::Time+Clone+'static, @@ -168,8 +160,6 @@ where pub fn filter(&self, logic: F) -> Arranged> where - Tr::Diff: 'static, - G::Timestamp: Clone+'static, F: FnMut(Tr::Key<'_>, Tr::Val<'_>)->bool+Clone+'static, { let logic1 = logic.clone(); @@ -186,7 +176,6 @@ where /// supplied as arguments to an operator using the same key-value structure. pub fn as_collection(&self, mut logic: L) -> Collection where - Tr::Diff: Semigroup, L: FnMut(Tr::Key<'_>, Tr::Val<'_>) -> D+'static, { self.flat_map_ref(move |key, val| Some(logic(key,val))) @@ -198,7 +187,6 @@ where /// filtering or flat mapping as part of the extraction. pub fn flat_map_ref(&self, logic: L) -> Collection where - Tr::Diff: Semigroup, I: IntoIterator, I::Item: Data, L: FnMut(Tr::Key<'_>, Tr::Val<'_>) -> I+'static, @@ -215,7 +203,6 @@ where /// If you have the arrangement, its `flat_map_ref` method is equivalent to this. pub fn flat_map_batches(stream: &Stream, mut logic: L) -> Collection where - Tr::Diff: Semigroup, I: IntoIterator, I::Item: Data, L: FnMut(Tr::Key<'_>, Tr::Val<'_>) -> I+'static, @@ -249,10 +236,9 @@ where /// (key, value, time, diff) accumulations in the `self` trace. pub fn lookup(&self, queries: &Stream) -> Stream where - G::Timestamp: Data+Lattice+Ord+TotalOrder, Tr::KeyOwned: ExchangeData+Hashable, Tr::ValOwned: ExchangeData, - Tr::Diff: ExchangeData+Semigroup, + Tr::Diff: ExchangeData, Tr: 'static, { // while the arrangement is already correctly distributed, the query stream may not be. @@ -408,24 +394,22 @@ where use crate::difference::Multiply; // Direct join implementations. -impl Arranged +impl Arranged where - G::Timestamp: Lattice+Ord, - Tr: TraceReader + Clone + 'static, - Tr::Diff: Semigroup, + G: Scope, + T1: TraceReader + Clone + 'static, { /// A direct implementation of the `JoinCore::join_core` method. - pub fn join_core(&self, other: &Arranged, mut result: L) -> Collection>::Output> + pub fn join_core(&self, other: &Arranged, mut result: L) -> Collection>::Output> where - Tr2: for<'a> TraceReader=Tr::Key<'a>,Time=G::Timestamp>+Clone+'static, - Tr2::Diff: Semigroup, - Tr::Diff: Multiply, - >::Output: Semigroup, + T2: for<'a> TraceReader=T1::Key<'a>,Time=T1::Time>+Clone+'static, + T1::Diff: Multiply, + >::Output: Semigroup, I: IntoIterator, I::Item: Data, - L: FnMut(Tr::Key<'_>,Tr::Val<'_>,Tr2::Val<'_>)->I+'static + L: FnMut(T1::Key<'_>,T1::Val<'_>,T2::Val<'_>)->I+'static { - let result = move |k: Tr::Key<'_>, v1: Tr::Val<'_>, v2: Tr2::Val<'_>, t: &G::Timestamp, r1: &Tr::Diff, r2: &Tr2::Diff| { + let result = move |k: T1::Key<'_>, v1: T1::Val<'_>, v2: T2::Val<'_>, t: &G::Timestamp, r1: &T1::Diff, r2: &T2::Diff| { let t = t.clone(); let r = (r1.clone()).multiply(r2); result(k, v1, v2).into_iter().map(move |d| (d, t.clone(), r.clone())) @@ -433,14 +417,13 @@ where self.join_core_internal_unsafe(other, result) } /// A direct implementation of the `JoinCore::join_core_internal_unsafe` method. - pub fn join_core_internal_unsafe (&self, other: &Arranged, result: L) -> Collection + pub fn join_core_internal_unsafe (&self, other: &Arranged, result: L) -> Collection where - Tr2: for<'a> TraceReader=Tr::Key<'a>, Time=G::Timestamp>+Clone+'static, - Tr2::Diff: Semigroup, + T2: for<'a> TraceReader=T1::Key<'a>, Time=T1::Time>+Clone+'static, D: Data, ROut: Semigroup, I: IntoIterator, - L: FnMut(Tr::Key<'_>, Tr::Val<'_>,Tr2::Val<'_>,&G::Timestamp,&Tr::Diff,&Tr2::Diff)->I+'static, + L: FnMut(T1::Key<'_>, T1::Val<'_>,T2::Val<'_>,&G::Timestamp,&T1::Diff,&T2::Diff)->I+'static, { use crate::operators::join::join_traces; join_traces(self, other, result) @@ -449,16 +432,15 @@ where // Direct reduce implementations. use crate::difference::Abelian; -impl Arranged +impl Arranged where - G::Timestamp: Lattice+Ord, - T1: TraceReader+Clone+'static, - T1::Diff: Semigroup, + G: Scope, + T1: TraceReader + Clone + 'static, { /// A direct implementation of `ReduceCore::reduce_abelian`. pub fn reduce_abelian(&self, name: &str, mut logic: L) -> Arranged> where - T2: for<'a> Trace= T1::Key<'a>, Time=G::Timestamp>+'static, + T2: for<'a> Trace= T1::Key<'a>, Time=T1::Time>+'static, T2::ValOwned: Data, T2::Diff: Abelian, T2::Batch: Batch, @@ -477,9 +459,8 @@ where /// A direct implementation of `ReduceCore::reduce_core`. pub fn reduce_core(&self, name: &str, logic: L) -> Arranged> where - T2: for<'a> Trace=T1::Key<'a>, Time=G::Timestamp>+'static, + T2: for<'a> Trace=T1::Key<'a>, Time=T1::Time>+'static, T2::ValOwned: Data, - T2::Diff: Semigroup, T2::Batch: Batch, T2::Builder: Builder, L: FnMut(T1::Key<'_>, &[(T1::Val<'_>, T1::Diff)], &mut Vec<(::ValOwned,T2::Diff)>, &mut Vec<(::ValOwned, T2::Diff)>)+'static, @@ -490,10 +471,10 @@ where } -impl<'a, G: Scope, Tr> Arranged, Tr> +impl<'a, G, Tr> Arranged, Tr> where - G::Timestamp: Lattice+Ord, - Tr: TraceReader + Clone, + G: Scope, + Tr: TraceReader + Clone, { /// Brings an arranged collection out of a nested region. /// diff --git a/src/operators/arrange/upsert.rs b/src/operators/arrange/upsert.rs index 4ad592f9a..e9d1744ff 100644 --- a/src/operators/arrange/upsert.rs +++ b/src/operators/arrange/upsert.rs @@ -108,7 +108,6 @@ use timely::progress::Timestamp; use timely::progress::Antichain; use timely::dataflow::operators::Capability; -use crate::lattice::Lattice; use crate::operators::arrange::arrangement::Arranged; use crate::trace::Builder; use crate::trace::{self, Trace, TraceReader, Batch, Cursor}; @@ -131,11 +130,11 @@ pub fn arrange_from_upsert( name: &str, ) -> Arranged> where - G: Scope, - G::Timestamp: Lattice+Ord+TotalOrder+ExchangeData, + G: Scope, + Tr: Trace+TraceReader+'static, Tr::KeyOwned: ExchangeData+Hashable+std::hash::Hash, Tr::ValOwned: ExchangeData, - Tr: Trace+TraceReader+'static, + Tr::Time: TotalOrder+ExchangeData, Tr::Batch: Batch, Tr::Builder: Builder, { diff --git a/src/operators/arrange/writer.rs b/src/operators/arrange/writer.rs index 5792a7a0f..acc049d30 100644 --- a/src/operators/arrange/writer.rs +++ b/src/operators/arrange/writer.rs @@ -8,7 +8,6 @@ use std::cell::RefCell; use timely::progress::{Antichain, Timestamp}; -use crate::lattice::Lattice; use crate::trace::{Trace, Batch, BatchReader}; use crate::trace::wrappers::rc::TraceBox; @@ -23,7 +22,6 @@ use super::TraceReplayInstruction; pub struct TraceWriter where Tr: Trace, - Tr::Time: Lattice+Timestamp+Ord+Clone+std::fmt::Debug+'static, Tr::Batch: Batch, { /// Current upper limit. @@ -37,7 +35,6 @@ where impl TraceWriter where Tr: Trace, - Tr::Time: Lattice+Timestamp+Ord+Clone+std::fmt::Debug+'static, Tr::Batch: Batch, { /// Creates a new `TraceWriter`. @@ -107,7 +104,6 @@ where impl Drop for TraceWriter where Tr: Trace, - Tr::Time: Lattice+Timestamp+Ord+Clone+std::fmt::Debug+'static, Tr::Batch: Batch, { fn drop(&mut self) { diff --git a/src/operators/count.rs b/src/operators/count.rs index d03be592a..0779bde06 100644 --- a/src/operators/count.rs +++ b/src/operators/count.rs @@ -50,12 +50,13 @@ where G::Timestamp: TotalOrder+Lattice+Ord { } } -impl CountTotal for Arranged +impl CountTotal for Arranged where - G::Timestamp: TotalOrder+Lattice+Ord, - T1: for<'a> TraceReader=&'a (), Time=G::Timestamp>+Clone+'static, + G: Scope, + T1: for<'a> TraceReader=&'a ()>+Clone+'static, T1::KeyOwned: ExchangeData, - T1::Diff: ExchangeData+Semigroup, + T1::Time: TotalOrder, + T1::Diff: ExchangeData, { fn count_total_core>(&self) -> Collection { diff --git a/src/operators/join.rs b/src/operators/join.rs index 62156cecb..ee1c28724 100644 --- a/src/operators/join.rs +++ b/src/operators/join.rs @@ -163,12 +163,10 @@ where impl Join for Arranged where - G: Scope, - G::Timestamp: Lattice+Ord, - Tr: for<'a> TraceReader = &'a K, Val<'a> = &'a V>+Clone+'static, + G: Scope, + Tr: for<'a> TraceReader = &'a K, Val<'a> = &'a V>+Clone+'static, K: ExchangeData+Hashable, V: Data + 'static, - Tr::Diff: Semigroup, { fn join_map(&self, other: &Collection, mut logic: L) -> Collection>::Output> where @@ -233,7 +231,6 @@ pub trait JoinCore (&self, stream2: &Arranged, result: L) -> Collection>::Output> where Tr2: for<'a> TraceReader=&'a K, Time=G::Timestamp>+Clone+'static, - Tr2::Diff: Semigroup, R: Multiply, >::Output: Semigroup, I: IntoIterator, @@ -277,7 +274,6 @@ pub trait JoinCore (&self, stream2: &Arranged, result: L) -> Collection where Tr2: for<'a> TraceReader=&'a K, Time=G::Timestamp>+Clone+'static, - Tr2::Diff: Semigroup, D: Data, ROut: Semigroup, I: IntoIterator, @@ -297,7 +293,6 @@ where fn join_core (&self, stream2: &Arranged, result: L) -> Collection>::Output> where Tr2: for<'a> TraceReader=&'a K, Time=G::Timestamp>+Clone+'static, - Tr2::Diff: Semigroup, R: Multiply, >::Output: Semigroup, I: IntoIterator, @@ -311,7 +306,6 @@ where fn join_core_internal_unsafe (&self, stream2: &Arranged, result: L) -> Collection where Tr2: for<'a> TraceReader=&'a K, Time=G::Timestamp>+Clone+'static, - Tr2::Diff: Semigroup, I: IntoIterator, L: FnMut(&K,&V,Tr2::Val<'_>,&G::Timestamp,&R,&Tr2::Diff)->I+'static, D: Data, @@ -331,12 +325,9 @@ where /// The "correctness" of this method depends heavily on the behavior of the supplied `result` function. pub fn join_traces(arranged1: &Arranged, arranged2: &Arranged, mut result: L) -> Collection where - G: Scope, - G::Timestamp: Lattice+Ord, - T1: TraceReader+Clone+'static, - T1::Diff: Semigroup, - T2: for<'a> TraceReader=T1::Key<'a>, Time=G::Timestamp>+Clone+'static, - T2::Diff: Semigroup, + G: Scope, + T1: TraceReader+Clone+'static, + T2: for<'a> TraceReader=T1::Key<'a>, Time=T1::Time>+Clone+'static, D: Data, R: Semigroup, I: IntoIterator, @@ -589,8 +580,6 @@ where R: Semigroup, C1: Cursor, C2: for<'a> Cursor=C1::Key<'a>, Time=T>, - C1::Diff: Semigroup, - C2::Diff: Semigroup, D: Ord+Clone+Data, { trace: C1, @@ -606,8 +595,6 @@ impl Deferred where C1: Cursor, C2: for<'a> Cursor=C1::Key<'a>, Time=T>, - C1::Diff: Semigroup, - C2::Diff: Semigroup, T: Timestamp+Lattice+Ord, R: Semigroup, D: Clone+Data, @@ -702,9 +689,6 @@ struct JoinThinker<'a, C1, C2> where C1: Cursor, C2: Cursor