#[derive(Debug)] pub struct TimedInstruction<I> { pub time: crate::body::TIME, pub instruction: I, } pub trait InstructionEmitter<I> { fn next_instruction(&self, time_limit:crate::body::TIME) -> Option<TimedInstruction<I>>; } pub trait InstructionConsumer<I> { fn process_instruction(&mut self, instruction:TimedInstruction<I>); } //PROPER PRIVATE FIELDS!!! pub struct InstructionCollector<I> { time: crate::body::TIME, instruction: Option<I>, } impl<I> InstructionCollector<I> { pub fn new(time:crate::body::TIME) -> Self { Self{ time, instruction:None } } pub fn collect(&mut self,instruction:Option<TimedInstruction<I>>){ match instruction { Some(unwrap_instruction) => { if unwrap_instruction.time<self.time { self.time=unwrap_instruction.time; self.instruction=Some(unwrap_instruction.instruction); } }, None => (), } } pub fn instruction(self) -> Option<TimedInstruction<I>> { //STEAL INSTRUCTION AND DESTROY INSTRUCTIONCOLLECTOR match self.instruction { Some(instruction)=>Some(TimedInstruction{ time:self.time, instruction }), None => None, } } }