differential_dogs3/operators/
count.rs1use timely::dataflow::Scope;
2
3use differential_dataflow::{ExchangeData, VecCollection, Hashable};
4use differential_dataflow::difference::{Semigroup, Monoid, Multiply};
5use differential_dataflow::operators::arrange::Arranged;
6use differential_dataflow::trace::TraceReader;
7
8pub fn count<G, Tr, K, R, F, P>(
15 prefixes: &VecCollection<G, (P, usize, usize), R>,
16 arrangement: Arranged<G, Tr>,
17 key_selector: F,
18 index: usize,
19) -> VecCollection<G, (P, usize, usize), R>
20where
21 G: Scope<Timestamp=Tr::Time>,
22 Tr: TraceReader<KeyOwn = K, Time: std::hash::Hash, Diff=isize>+Clone+'static,
23 for<'a> Tr::Diff : Semigroup<Tr::DiffGat<'a>>,
24 K: Hashable + Ord + Default + 'static,
25 R: Monoid+Multiply<Output = R>+ExchangeData,
26 F: Fn(&P)->K+Clone+'static,
27 P: ExchangeData,
28{
29 crate::operators::lookup_map(
30 prefixes,
31 arrangement,
32 move |p: &(P,usize,usize), k: &mut K| { *k = key_selector(&p.0); },
33 move |(p,c,i), r, _, s| {
34 let s = *s as usize;
35 if *c < s { ((p.clone(), *c, *i), r.clone()) }
36 else { ((p.clone(), s, index), r.clone()) }
37 },
38 Default::default(),
39 Default::default(),
40 Default::default(),
41 )
42}