hydro_std/
membership.rs

1use std::hash::Hash;
2
3use hydro_lang::keyed_singleton::KeyedSingleton;
4use hydro_lang::keyed_stream::KeyedStream;
5use hydro_lang::location::MembershipEvent;
6use hydro_lang::{Location, Unbounded};
7use stageleft::q;
8
9pub fn track_membership<'a, K: Hash + Eq, L: Location<'a>>(
10    membership: KeyedStream<K, MembershipEvent, L, Unbounded>,
11) -> KeyedSingleton<K, (), L, Unbounded> {
12    membership
13        .fold(
14            q!(|| false),
15            q!(|present, event| {
16                match event {
17                    MembershipEvent::Joined => *present = true,
18                    MembershipEvent::Left => *present = false,
19                }
20            }),
21        )
22        .filter_map(q!(|v| if v { Some(()) } else { None }))
23}