1use std::sync::Arc;
2
3use algebra::{
4 AdemAlgebra, SteenrodAlgebra,
5 module::{FDModule, TensorModule, steenrod_module},
6};
7use anyhow::anyhow;
8use ext::utils::parse_module_name;
9use fp::prime::{Prime, ValidPrime};
10use serde_json::json;
11
12fn main() -> anyhow::Result<()> {
13 ext::utils::init_logging()?;
14
15 let left = query::with_default("Left module", "S_2", parse_module_name);
16 let p = left["p"].as_u64().unwrap();
17
18 let right = query::with_default("Right module", "S_2", |name| {
19 let module = parse_module_name(name)?;
20 if module["p"].as_u64() == Some(p) {
21 Ok(module)
22 } else {
23 Err(anyhow!("Two modules must be over the same prime"))
24 }
25 });
26
27 let p = ValidPrime::new(p as u32);
28 let algebra = Arc::new(SteenrodAlgebra::AdemAlgebra(AdemAlgebra::new(p, false)));
29 let left_module = steenrod_module::from_json(Arc::clone(&algebra), &left)?;
30 let right_module = steenrod_module::from_json(Arc::clone(&algebra), &right)?;
31
32 let mut tensor = FDModule::from(&TensorModule::new(
33 Arc::new(left_module),
34 Arc::new(right_module),
35 ));
36 tensor.name = String::new();
37
38 let mut output = json!({
39 "p": p.as_u32(),
40 });
41 tensor.to_json(&mut output);
42
43 println!("{output}");
44 Ok(())
45}