1use anyhow::format_err;
4
5use crate::analysis::Orbit;
6use crate::chartab::CharacterTable;
7use crate::chartab::character::Character;
8use crate::chartab::chartab_group::CharacterProperties;
9use crate::group::GroupProperties;
10
11pub trait Projectable<G, I>: Orbit<G, I>
13where
14 G: GroupProperties + CharacterProperties,
15{
16 type Projected<'p>
18 where
19 Self: 'p;
20
21 fn project_onto(&self, row: &G::RowSymbol) -> Self::Projected<'_>;
26
27 fn generate_orbit_algebra_terms<'a>(
33 &'a self,
34 row: &G::RowSymbol,
35 ) -> impl Iterator<Item = Result<(&'a Character, I), anyhow::Error>>
36 where
37 I: 'a,
38 G: 'a,
39 {
40 self.iter().enumerate().map(|(i, item_res)| {
41 let chr = self
42 .group()
43 .get_cc_of_element_index(i)
44 .and_then(|cc_i| self.group().get_cc_symbol_of_index(cc_i))
45 .map(|cc| self.group().character_table().get_character(row, &cc))
46 .ok_or_else(|| {
47 format_err!(
48 "Unable to obtain the character of the row {} for element index {i}.",
49 row.clone()
50 )
51 })?;
52 item_res.map(|item| (chr, item))
53 })
54 }
55}