use crate::io::AnonymousIn; use crate::io::AnonymousOut; use crate::io::In; use crate::io::Out; use crate::io::edge::BlockIOIndex; pub enum BlockResult { // Signifies that the block can be scheduled again. Ok, // Signifies that the block finished its work // Running it again would be useless Terminated, // Kill graph Exit, } pub trait BlockInput { fn get_inputs_mut(&mut self) -> Vec<&mut dyn AnonymousIn>; fn get_inputs(&self) -> Vec<&dyn AnonymousIn>; // Meta information fn get_types_names(&self) -> Vec<&'static str>; } pub trait BlockOutput { fn get_outputs_mut(&mut self) -> Vec<&mut dyn AnonymousOut>; fn get_outputs(&self) -> Vec<&dyn AnonymousOut>; // Meta information fn get_types_names(&self) -> Vec<&'static str>; } pub trait BlockIO { fn get_inputs_mut(&mut self) -> Vec<&mut dyn AnonymousIn>; fn get_outputs_mut(&mut self) -> Vec<&mut dyn AnonymousOut>; fn get_inputs(&self) -> Vec<&dyn AnonymousIn>; fn get_outputs(&self) -> Vec<&dyn AnonymousOut>; fn get_successors(&self) -> Vec { self.get_outputs() .iter() .map(|x| x.get_consumer_block().unwrap()) .collect() } // Get all of the BlockIOIndices (block index + port) that // this blocks can send data to. // fn get_successors(&self) -> Vec; // // // Sets the index of the current blocks on the shared edges // fn set_index(&self, block_index: usize); // // // Number of input/output ports // fn input_count(&self) -> usize; // fn output_count(&self) -> usize; // // // Stream managment // fn set_anonymous_out_stream(&mut self, output_index: usize, producer: AnonymousStreamProducer); // fn set_anonymous_in_stream(&mut self, input_index: usize, consumer: AnonymousStreamConsumer); // // fn create_anonymous_stream_for( // &mut self, // output_index: usize, // capacity: usize, // ) -> (AnonymousStreamProducer, AnonymousStreamConsumer); // Meta information fn get_block_name(&self) -> &'static str; fn get_input_names(&self) -> Vec<&'static str>; fn get_output_names(&self) -> Vec<&'static str>; fn get_output_type_names(&self) -> Vec<&'static str>; } pub trait Block { fn work(&mut self) -> BlockResult; } // Represents the input, output, state types // that a SyncBlock will have to interacti with pub trait SyncBlockIO<'view> { type StateView; type Input; type Output; } pub trait SyncBlock<'view>: SyncBlockIO<'view> { fn sync_work(state: Self::StateView, input: Self::Input) -> Option; } pub trait GraphableBlock: Block + BlockIO {} impl GraphableBlock for T where T: Block + BlockIO {} impl BlockInput for In { fn get_inputs_mut(&mut self) -> Vec<&mut dyn AnonymousIn> { vec![self] } fn get_inputs(&self) -> Vec<&dyn AnonymousIn> { vec![self] } fn get_types_names(&self) -> Vec<&'static str> { vec![std::any::type_name::()] } } impl BlockInput for Option { fn get_inputs_mut(&mut self) -> Vec<&mut dyn AnonymousIn> { if let Some(input) = self { input.get_inputs_mut() } else { vec![] } } fn get_inputs(&self) -> Vec<&dyn AnonymousIn> { if let Some(input) = self { input.get_inputs() } else { vec![] } } fn get_types_names(&self) -> Vec<&'static str> { if let Some(input) = self { input.get_types_names() } else { vec![] } } } impl BlockInput for [I; N] { fn get_inputs(&self) -> Vec<&dyn AnonymousIn> { let mut output = vec![]; for input in self { output.extend(input.get_inputs()); } output } fn get_inputs_mut(&mut self) -> Vec<&mut dyn AnonymousIn> { let mut output = vec![]; for input in self { output.extend(input.get_inputs_mut()); } output } fn get_types_names(&self) -> Vec<&'static str> { vec![std::any::type_name::(); N] } } impl BlockOutput for Out { fn get_outputs_mut(&mut self) -> Vec<&mut dyn AnonymousOut> { vec![self] } fn get_outputs(&self) -> Vec<&dyn AnonymousOut> { vec![self] } fn get_types_names(&self) -> Vec<&'static str> { vec![std::any::type_name::()] } } impl BlockOutput for Option { fn get_outputs_mut(&mut self) -> Vec<&mut dyn AnonymousOut> { if let Some(output) = self { output.get_outputs_mut() } else { vec![] } } fn get_outputs(&self) -> Vec<&dyn AnonymousOut> { if let Some(output) = self { output.get_outputs() } else { vec![] } } fn get_types_names(&self) -> Vec<&'static str> { if let Some(input) = self { input.get_types_names() } else { vec![] } } } impl BlockOutput for [I; N] { fn get_outputs_mut(&mut self) -> Vec<&mut dyn AnonymousOut> { let mut result = vec![]; for output in self { result.extend(output.get_outputs_mut()); } result } fn get_outputs(&self) -> Vec<&dyn AnonymousOut> { let mut result = vec![]; for output in self { result.extend(output.get_outputs()); } result } fn get_types_names(&self) -> Vec<&'static str> { vec![std::any::type_name::(); N] } }