use std::collections::HashSet;
use std::future::{Future, ready};
use std::sync::Mutex;
use crate::Result;
use crate::frontier::seed::Fingerprint;
use crate::frontier::seen::SeenSet;
use crate::sync::lock;
#[derive(Debug, Default)]
pub struct InMemSeen {
seen: Mutex<HashSet<Fingerprint>>,
}
impl InMemSeen {
#[must_use]
pub fn snapshot(&self) -> Vec<Fingerprint> {
lock(&self.seen).iter().copied().collect()
}
}
impl FromIterator<Fingerprint> for InMemSeen {
fn from_iter<I: IntoIterator<Item = Fingerprint>>(fingerprints: I) -> Self {
Self {
seen: Mutex::new(fingerprints.into_iter().collect()),
}
}
}
impl SeenSet for InMemSeen {
fn insert(&self, fingerprint: Fingerprint) -> impl Future<Output = Result<bool>> + Send {
ready(Ok(lock(&self.seen).insert(fingerprint)))
}
}