microcad_lang/lower/ir/identifier/
identifier_list.rs1use derive_more::{Deref, DerefMut};
5use microcad_lang_base::{Identifier, Refer, SrcRef};
6use microcad_lang_proc_macros::SrcReferrer;
7
8#[derive(Default, Debug, Clone, PartialEq, Deref, DerefMut, SrcReferrer)]
13pub struct IdentifierList(pub Refer<Vec<Identifier>>);
14
15impl FromIterator<Identifier> for IdentifierList {
16 fn from_iter<T: IntoIterator<Item = Identifier>>(iter: T) -> Self {
17 let v: Vec<_> = iter.into_iter().collect();
18 let src_ref = SrcRef::merge_all(v.iter());
19 Self(Refer::new(v, src_ref))
20 }
21}
22
23impl std::fmt::Display for IdentifierList {
24 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
25 let mut sorted = self.0.clone();
26 sorted.sort();
27 write!(
28 f,
29 "{}",
30 sorted
31 .iter()
32 .map(|id| id.to_string())
33 .collect::<Vec<_>>()
34 .join(",")
35 )
36 }
37}
38
39impl std::iter::IntoIterator for IdentifierList {
40 type Item = Identifier;
41 type IntoIter = std::vec::IntoIter<Self::Item>;
42
43 fn into_iter(self) -> Self::IntoIter {
44 self.0.into_iter()
45 }
46}