pub fn propose_distinct<G, Tr, K, F, P, V>(
    prefixes: &Collection<G, P, Tr::Diff>,
    arrangement: Arranged<G, Tr>,
    key_selector: F,
) -> Collection<G, (P, V), Tr::Diff>
where
    G: Scope<Timestamp=Tr::Time>,
    Tr: TraceReader+Clone+'static,
    for<'a> Tr::Key<'a> : IntoOwned<'a, Owned = K>,
    for<'a> Tr::Diff : Semigroup<Tr::DiffGat<'a>>,
    K: Hashable + Default + Ord + 'static,
    Tr::Diff: Monoid+Multiply<Output = Tr::Diff>+ExchangeData,
    F: Fn(&P)->K+Clone+'static,
    P: ExchangeData,
    V: Clone + 'static,
    for<'a> Tr::Val<'a> : IntoOwned<'a, Owned = V>,
{
    crate::operators::lookup_map(
        prefixes,
        arrangement,
        move |p: &P, k: &mut K| { *k = key_selector(p); },
        move |prefix, diff, value, _sum| ((prefix.clone(), value.into_owned()), diff.clone()),
        Default::default(),
        Default::default(),
        Default::default(),
    )
}
Proposes distinct extensions to a prefix stream.

Unlike `propose`, this method does not scale the multiplicity of matched
prefixes by the number of matches in `arrangement`. This can be useful to
avoid the need to prepare an arrangement of distinct extensions.
dogsdogsdogs/src/operators/propose.rs