algebra/module/
steenrod_module.rs1use 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;