use std::hash::Hash;
use differential_dataflow::{ExchangeData, VecCollection};
use differential_dataflow::difference::{Semigroup, Monoid, Multiply};
use differential_dataflow::operators::arrange::Arranged;
use differential_dataflow::trace::TraceReader;
pub fn validate<'scope, K, V, Tr, F, P>(
extensions: VecCollection<'scope, Tr::Time, (P, V), Tr::Diff>,
arrangement: Arranged<'scope, Tr>,
key_selector: F,
) -> VecCollection<'scope, Tr::Time, (P, V), Tr::Diff>
where
Tr: for<'a> TraceReader<
Time: std::hash::Hash,
Diff : Semigroup<Tr::DiffGat<'a>>+Monoid+Multiply<Output = Tr::Diff>+ExchangeData,
>+Clone+'static,
Tr::KeyContainer: differential_dataflow::trace::implementations::BatchContainer<Owned=(K,V)>,
K: Ord+Hash+Clone+Default + 'static,
V: ExchangeData+Hash+Default,
F: Fn(&P)->K+Clone+'static,
P: ExchangeData,
{
crate::operators::lookup_map(
extensions,
arrangement,
move |(pre,val),key| { *key = (key_selector(pre), val.clone()); },
|(pre,val),r,_,_| ((pre.clone(), val.clone()), r.clone()),
Default::default(),
Default::default(),
Default::default(),
)
}