use alloy::primitives::{Address, map::HashSet};
use core::future::{self, Future};
use std::sync::{Arc, Mutex};
pub trait AliasOracle {
fn should_alias(&self, address: Address) -> impl Future<Output = eyre::Result<bool>> + Send;
}
impl AliasOracle for HashSet<Address> {
fn should_alias(&self, address: Address) -> impl Future<Output = eyre::Result<bool>> + Send {
future::ready(Ok(self.contains(&address)))
}
}
pub trait AliasOracleFactory: Send + Sync + 'static {
type Oracle: AliasOracle;
fn create(&self) -> eyre::Result<Self::Oracle>;
}
impl AliasOracleFactory for HashSet<Address> {
type Oracle = HashSet<Address>;
fn create(&self) -> eyre::Result<Self::Oracle> {
Ok(self.clone())
}
}
impl<T> AliasOracleFactory for Mutex<T>
where
T: AliasOracleFactory,
{
type Oracle = T::Oracle;
fn create(&self) -> eyre::Result<Self::Oracle> {
let guard =
self.lock().map_err(|_| eyre::eyre!("failed to lock AliasOracleFactory mutex"))?;
guard.create()
}
}
impl<T> AliasOracleFactory for Arc<T>
where
T: AliasOracleFactory,
{
type Oracle = T::Oracle;
fn create(&self) -> eyre::Result<Self::Oracle> {
self.as_ref().create()
}
}