extern crate discrete;
use discrete::*;
fn main() {
let mood = 3;
let goal = 2;
let direction = 4;
let context: (Either<DirectedContext, DimensionN>, DimensionN) = Construct::new();
let dim = ((vec![mood, goal], vec![mood, goal, direction]), vec![4, 4]);
let count = context.count(&dim);
println!("count: {:?}", count);
let mut pos = (Select::Fst((vec![0, 0], 1, 1)), vec![0, 0]);
for x in 0..5 {
context.to_pos(&dim, x, &mut pos);
println!("\n{}/{} {}% {:?}", x, count, (100.0 * (x as f64) / (count as f64)).round(), pos);
desc(&pos);
}
}
fn desc(pos: &(Select<(Vec<usize>, usize, usize), Vec<usize>>, Vec<usize>)) {
let (mood, goal, change, new_value, direction) = match pos.0 {
Select::Fst(ref pos) => (pos.0[0], pos.0[1], pos.1, pos.2, None),
Select::Snd(ref pos) => (pos[0], pos[1], 2, pos[2], Some(pos[2])),
};
let x = pos.1[0];
let y = pos.1[1];
print!("Mood: ");
desc_mood(mood);
print!("Goal: ");
desc_goal(goal);
if let Some(direction) = direction {
desc_direction(direction);
}
if change == 0 {
print!("Change mood to: ");
desc_mood(new_value);
} else if change == 1 {
print!("Change goal to: ");
desc_goal(new_value);
}
println!("Position: ({}, {})", x, y);
}
fn desc_mood(mood: usize) {
match mood {
0 => println!("Happy"),
1 => println!("Sad"),
2 => println!("Angry"),
_ => {}
}
}
fn desc_goal(goal: usize) {
match goal {
0 => println!("BeGood"),
1 => println!("BeBad"),
_ => {}
}
}
fn desc_direction(direction: usize) {
print!("Change position: ");
match direction {
0 => println!("go up"),
1 => println!("go right"),
2 => println!("go down"),
3 => println!("go left"),
_ => {}
}
}