133d722a9Sopenharmony_ciuse crate::intern::{self, InternedString};
233d722a9Sopenharmony_ciuse std::path::Path;
333d722a9Sopenharmony_ci
433d722a9Sopenharmony_cipub trait InternedVec<T>
533d722a9Sopenharmony_ciwhere
633d722a9Sopenharmony_ci    T: ?Sized,
733d722a9Sopenharmony_ci{
833d722a9Sopenharmony_ci    fn vec(&self) -> Vec<&'static T>;
933d722a9Sopenharmony_ci}
1033d722a9Sopenharmony_ci
1133d722a9Sopenharmony_ciimpl<T> InternedVec<T> for Vec<InternedString>
1233d722a9Sopenharmony_ciwhere
1333d722a9Sopenharmony_ci    T: ?Sized + Element,
1433d722a9Sopenharmony_ci{
1533d722a9Sopenharmony_ci    fn vec(&self) -> Vec<&'static T> {
1633d722a9Sopenharmony_ci        self.iter().copied().map(Element::unintern).collect()
1733d722a9Sopenharmony_ci    }
1833d722a9Sopenharmony_ci}
1933d722a9Sopenharmony_ci
2033d722a9Sopenharmony_cipub fn intern<T>(elements: &[&T]) -> Vec<InternedString>
2133d722a9Sopenharmony_ciwhere
2233d722a9Sopenharmony_ci    T: ?Sized + Element,
2333d722a9Sopenharmony_ci{
2433d722a9Sopenharmony_ci    elements.iter().copied().map(Element::intern).collect()
2533d722a9Sopenharmony_ci}
2633d722a9Sopenharmony_ci
2733d722a9Sopenharmony_cipub trait Element {
2833d722a9Sopenharmony_ci    fn intern(&self) -> InternedString;
2933d722a9Sopenharmony_ci    fn unintern(_: InternedString) -> &'static Self;
3033d722a9Sopenharmony_ci}
3133d722a9Sopenharmony_ci
3233d722a9Sopenharmony_ciimpl Element for str {
3333d722a9Sopenharmony_ci    fn intern(&self) -> InternedString {
3433d722a9Sopenharmony_ci        intern::intern(self)
3533d722a9Sopenharmony_ci    }
3633d722a9Sopenharmony_ci
3733d722a9Sopenharmony_ci    fn unintern(interned: InternedString) -> &'static Self {
3833d722a9Sopenharmony_ci        interned.str()
3933d722a9Sopenharmony_ci    }
4033d722a9Sopenharmony_ci}
4133d722a9Sopenharmony_ci
4233d722a9Sopenharmony_ciimpl Element for Path {
4333d722a9Sopenharmony_ci    fn intern(&self) -> InternedString {
4433d722a9Sopenharmony_ci        intern::intern(&self.to_string_lossy())
4533d722a9Sopenharmony_ci    }
4633d722a9Sopenharmony_ci
4733d722a9Sopenharmony_ci    fn unintern(interned: InternedString) -> &'static Self {
4833d722a9Sopenharmony_ci        Path::new(interned.str())
4933d722a9Sopenharmony_ci    }
5033d722a9Sopenharmony_ci}
51