extern crate message_to_parent;
use message_to_parent::MessageToParent;
struct Parent {
child: Child,
is_mutant: bool,
}
impl Parent {
pub fn new() -> Self {
Self {
child: Child::new(),
is_mutant: false,
}
}
pub fn main(&mut self) {
println!("parent: running mutation procedure on child.");
let mut mutation_instructions = self.child.mutate_parent();
println!("Tutorial side effects example begin ------------");
mutation_instructions.run_side_effects_accumulate_results(self);
println!("Tutorial side effects example end ------------\n");
println!("Tutorial observing side effects begin ------------");
for result in mutation_instructions.get_results() {
println!("result: {}", result);
}
println!("Tutorial observing side effects end ------------");
}
pub fn parent_mutate_procedure(&mut self) {
println!("parent: Am I a mutant? {}", self.is_mutant);
}
}
struct Child {}
impl Child {
pub fn new() -> Self {
Self {}
}
pub fn mutate_parent(&mut self) -> MessageToParent<Parent, bool> {
println!("child: Attempting to mutate parent!");
let mut returning_message = MessageToParent::<Parent, bool>::new();
println!("\nTutorial not running example begin ------------");
returning_message.add_side_effect(|parent| {
parent.parent_mutate_procedure();
false
});
returning_message.add_side_effect(|parent| {
println!("child: mutating parent!");
parent.is_mutant = true;
parent.is_mutant
});
returning_message.add_side_effect(|parent| {
parent.parent_mutate_procedure();
true
});
println!("Tutorial not running example end ------------\n");
returning_message
}
}
fn main() {
Parent::new().main();
}