use std::hash::BuildHasherDefault;
use std::sync::Arc;
use rustc_hash::FxHasher;
use uv_distribution_types::{DistributionId, IndexUrl};
use uv_normalize::PackageName;
use uv_once_map::OnceMap;
use crate::resolver::provider::{MetadataResponse, VersionsResponse};
#[derive(Default, Clone)]
pub struct InMemoryIndex(Arc<SharedInMemoryIndex>);
#[derive(Default)]
struct SharedInMemoryIndex {
implicit: FxOnceMap<PackageName, Arc<VersionsResponse>>,
explicit: FxOnceMap<(PackageName, IndexUrl), Arc<VersionsResponse>>,
distributions: FxOnceMap<DistributionId, Arc<MetadataResponse>>,
}
pub(crate) type FxOnceMap<K, V> = OnceMap<K, V, BuildHasherDefault<FxHasher>>;
impl InMemoryIndex {
pub fn implicit(&self) -> &FxOnceMap<PackageName, Arc<VersionsResponse>> {
&self.0.implicit
}
pub fn explicit(&self) -> &FxOnceMap<(PackageName, IndexUrl), Arc<VersionsResponse>> {
&self.0.explicit
}
pub fn distributions(&self) -> &FxOnceMap<DistributionId, Arc<MetadataResponse>> {
&self.0.distributions
}
}