feat: Implement Pipeline support
Adds support for pipelines, allowing streams to be chained together and transformed. This includes new types for `PipeStream` and `SourceAdapter`, along with modifications to the `Environment` to manage pipeline execution. A new example `pipeline.myc` demonstrates its usage.
This commit is contained in:
+17
-3
@@ -395,14 +395,28 @@ impl VM {
|
||||
return Err("Pipe lambda must be a function/closure".to_string());
|
||||
};
|
||||
|
||||
// Create the persistent execution closure for the PipeStream
|
||||
let mut pipe_vm = crate::ast::vm::VM::new(self.globals.clone());
|
||||
let my_closure = lambda_obj.clone();
|
||||
let executor: Box<dyn FnMut(Vec<Value>) -> Value> = Box::new(move |args: Vec<Value>| -> Value {
|
||||
match pipe_vm.run_with_args(my_closure.clone(), args) {
|
||||
Ok(res) => res,
|
||||
Err(e) => panic!("Pipeline lambda execution failed: {}", e),
|
||||
}
|
||||
});
|
||||
|
||||
let pipe = Rc::new(RefCell::new(PipeStream::new(
|
||||
"pipe".to_string(),
|
||||
inputs.len(),
|
||||
Some(lambda_obj)
|
||||
Some(executor)
|
||||
)));
|
||||
|
||||
for stream in obs_streams {
|
||||
stream.add_observer(pipe.clone() as Rc<RefCell<dyn crate::ast::rtl::streams::Observer>>);
|
||||
for (i, stream) in obs_streams.into_iter().enumerate() {
|
||||
let adapter = Rc::new(RefCell::new(crate::ast::rtl::streams::SourceAdapter {
|
||||
target: pipe.clone() as Rc<RefCell<dyn crate::ast::rtl::streams::Observer>>,
|
||||
target_index: i,
|
||||
}));
|
||||
stream.add_observer(adapter);
|
||||
}
|
||||
|
||||
// Create the data buffer and pusher for the pipe's output
|
||||
|
||||
Reference in New Issue
Block a user