extern crate discrete;
use discrete::*;
use HPoint::*;
fn main() {
println!("A discrete homotopy space uses `EqPair` internally:");
let s: EqPair = Construct::new();
let dim = 4;
let n = s.count(&dim);
println!("dim = {}, count = {}", dim, n);
let mut pos = (0, 0);
for x in 0..n {
s.to_pos(&n, x, &mut pos);
println!("{:?}", pos);
}
println!("================================");
println!("Using `EqPair` recursively gives the complexity of homotopy levels:");
let mut dim = 4;
println!("{}", dim);
for _ in 0..5 {
dim = s.count(&dim);
println!("{}", dim);
}
println!("================================");
println!("Another way to construct a homotopy level 2 is to use `EqPair<Of<EqPair>>`:");
let s: EqPair<Of<EqPair>> = Construct::new();
let dim = 2;
println!("dim = {}, count = {}", dim, s.count(&dim));
println!("Similarly, at homotopy level 3 one can use `EqPair<Of<EqPair<Of<EqPair>>>>`:");
let s: EqPair<Of<EqPair<Of<EqPair>>>> = Construct::new();
let dim = 2;
println!("dim = {}, count = {}", dim, s.count(&dim));
println!("However, for the more general case is it easier to use the `Homotopy` space:");
let s: Homotopy = Construct::new();
let level = 2;
let pieces = 2;
let n = s.count(&(level, pieces));
println!("level = {}, pieces = {}, count = {}", level, pieces, n);
let mut pos = s.zero(&(level, pieces));
for x in 0..n {
s.to_pos(&(level, pieces), x, &mut pos);
println!("{:?}", pos);
}
println!("================================");
println!("The `HPoint` enum represents positions in the `Homotopy` space:");
let a = Path(Box::new((Point(0), Point(0))));
let b = Path(Box::new((Point(1), Point(1))));
let pos = Path(Box::new((a, b)));
let level = pos.level();
println!("{:?} - level {}", pos, level);
println!("index = {}", s.to_index(&(level, 2), &pos));
println!("================================");
println!("One can also construct a homotopy of another discrete space, e.g. `Homotopy<Of<Pair>>`:");
let s: Homotopy<Of<Pair>> = Construct::new();
let level = 1;
let pieces = 3;
let n = s.count(&(level, pieces));
println!("{}", n);
let mut pos = s.zero(&(level, pieces));
for x in 0..n {
s.to_pos(&(level, pieces), x, &mut pos);
println!("{:?}", pos);
}
}