1 use crate::intern::{self, InternedString};
2 use std::path::Path;
3 
4 pub trait InternedVec<T>
5 where
6     T: ?Sized,
7 {
vecnull8     fn vec(&self) -> Vec<&'static T>;
9 }
10 
11 impl<T> InternedVec<T> for Vec<InternedString>
12 where
13     T: ?Sized + Element,
14 {
15     fn vec(&self) -> Vec<&'static T> {
16         self.iter().copied().map(Element::unintern).collect()
17     }
18 }
19 
internnull20 pub fn intern<T>(elements: &[&T]) -> Vec<InternedString>
21 where
22     T: ?Sized + Element,
23 {
24     elements.iter().copied().map(Element::intern).collect()
25 }
26 
27 pub trait Element {
internnull28     fn intern(&self) -> InternedString;
uninternnull29     fn unintern(_: InternedString) -> &'static Self;
30 }
31 
32 impl 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 
42 impl Element for Path {
internnull43     fn intern(&self) -> InternedString {
44         intern::intern(&self.to_string_lossy())
45     }
46 
uninternnull47     fn unintern(interned: InternedString) -> &'static Self {
48         Path::new(interned.str())
49     }
50 }
51