use std::collections::HashMap;
use std::sync::Arc;
use crate::net::NetworkStatusListenerHandle;
use crate::network_status::NetworkStatus;
use super::monitor_runtime::MonitorRuntime;
pub(crate) type SharedListener = Arc<dyn Fn(NetworkStatus) + Send + Sync + 'static>;
pub(crate) type Dispatcher = Arc<dyn Fn(SharedListener, NetworkStatus) + Send + Sync + 'static>;
#[derive(Default)]
pub(crate) struct MonitorState {
pub(crate) reachability: NetworkStatus,
pub(crate) listeners: HashMap<NetworkStatusListenerHandle, SharedListener>,
next_listener_id: u64,
pub(crate) monitor: Option<MonitorRuntime>,
}
impl MonitorState {
pub(crate) fn next_listener_handle(&mut self) -> NetworkStatusListenerHandle {
loop {
self.next_listener_id = self.next_listener_id.wrapping_add(1);
if self.next_listener_id == 0 {
continue;
}
let handle = NetworkStatusListenerHandle::from_raw(self.next_listener_id);
if !self.listeners.contains_key(&handle) {
return handle;
}
}
}
}