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}