1use rustc_hash::FxHashMap;
2
3use crate::lock::{Package, PackageId};
4
5#[derive(Debug, Clone)]
7pub struct PackageMap<T>(FxHashMap<PackageId, T>);
8
9impl<T> Default for PackageMap<T> {
10 fn default() -> Self {
11 Self(FxHashMap::default())
12 }
13}
14
15impl<T> PackageMap<T> {
16 pub fn insert(&mut self, package: Package, value: T) -> Option<T> {
18 self.0.insert(package.id, value)
19 }
20
21 pub(crate) fn get(&self, package_id: &PackageId) -> Option<&T> {
23 self.0.get(package_id)
24 }
25}
26
27impl<T> FromIterator<(Package, T)> for PackageMap<T> {
28 fn from_iter<I: IntoIterator<Item = (Package, T)>>(iter: I) -> Self {
29 Self(
30 iter.into_iter()
31 .map(|(package, value)| (package.id, value))
32 .collect(),
33 )
34 }
35}
36
37impl<T> Extend<(Package, T)> for PackageMap<T> {
38 fn extend<I: IntoIterator<Item = (Package, T)>>(&mut self, iter: I) {
39 self.0
40 .extend(iter.into_iter().map(|(package, value)| (package.id, value)));
41 }
42}