1use crate::intern::{self, InternedString}; 2use std::path::Path; 3 4pub trait InternedVec<T> 5where 6 T: ?Sized, 7{ 8 fn vec(&self) -> Vec<&'static T>; 9} 10 11impl<T> InternedVec<T> for Vec<InternedString> 12where 13 T: ?Sized + Element, 14{ 15 fn vec(&self) -> Vec<&'static T> { 16 self.iter().copied().map(Element::unintern).collect() 17 } 18} 19 20pub fn intern<T>(elements: &[&T]) -> Vec<InternedString> 21where 22 T: ?Sized + Element, 23{ 24 elements.iter().copied().map(Element::intern).collect() 25} 26 27pub trait Element { 28 fn intern(&self) -> InternedString; 29 fn unintern(_: InternedString) -> &'static Self; 30} 31 32impl Element for str { 33 fn intern(&self) -> InternedString { 34 intern::intern(self) 35 } 36 37 fn unintern(interned: InternedString) -> &'static Self { 38 interned.str() 39 } 40} 41 42impl Element for Path { 43 fn intern(&self) -> InternedString { 44 intern::intern(&self.to_string_lossy()) 45 } 46 47 fn unintern(interned: InternedString) -> &'static Self { 48 Path::new(interned.str()) 49 } 50} 51