algebra/module/
steenrod_module.rs

1use crate::algebra::SteenrodAlgebra;
2
3pub type SteenrodModule = Box<dyn Module<Algebra = SteenrodAlgebra>>;
4
5mod json {
6    use std::sync::Arc;
7
8    use anyhow::anyhow;
9
10    use super::*;
11    use crate::module::{FDModule, FPModule, RealProjectiveSpace, SuspensionModule};
12
13    pub fn from_json(
14        algebra: Arc<SteenrodAlgebra>,
15        json: &serde_json::Value,
16    ) -> anyhow::Result<SteenrodModule> {
17        fn box_new(
18            m: impl Module<Algebra = SteenrodAlgebra>,
19            json: &serde_json::Value,
20        ) -> SteenrodModule {
21            if let Some(shift) = json["shift"].as_i64() {
22                Box::new(SuspensionModule::new(Arc::new(m), shift as i32))
23            } else {
24                Box::new(m)
25            }
26        }
27
28        match json["type"].as_str() {
29            Some("real projective space") => Ok(box_new(
30                RealProjectiveSpace::from_json(algebra, json)?,
31                json,
32            )),
33            Some("finite dimensional module") => {
34                Ok(box_new(FDModule::from_json(algebra, json)?, json))
35            }
36            Some("finitely presented module") => {
37                Ok(box_new(FPModule::from_json(algebra, json)?, json))
38            }
39            Some(x) => Err(anyhow!("Unknown module type: {}", x)),
40            None => Err(anyhow!("Missing module type")),
41        }
42    }
43}
44
45pub use json::*;
46
47use super::Module;