#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Gate {
Open,
Closed,
}
impl Gate {
pub fn is_open(&self) -> bool {
matches!(self, Self::Open)
}
pub fn is_closed(&self) -> bool {
matches!(self, Self::Closed)
}
}
pub struct GateRequest<T> {
pub action: Gate,
pub data: T,
}
#[cfg(test)]
mod tests {
use crate::{prelude::*, testing::*};
#[test]
fn test_gate_actions() {
let mut context = TestingContext::minimal_plugins();
let workflow = context.spawn_io_workflow(|scope, builder| {
let fork_input = scope.start.fork_clone(builder);
let buffer = builder.create_buffer(BufferSettings::keep_all());
fork_input
.clone_chain(builder)
.then_gate_close(buffer)
.connect(buffer.input_slot());
builder
.listen(buffer)
.consume_buffer::<8>()
.connect(scope.terminate);
fork_input
.clone_chain(builder)
.with_access(buffer)
.then(push_value.into_blocking_callback())
.then_gate_open(buffer)
.unused();
});
let r = context.try_resolve_request(2, workflow, 1).unwrap();
assert_eq!(r.len(), 2);
}
fn push_value(In((value, key)): In<(i32, BufferKey<i32>)>, mut access: BufferAccessMut<i32>) {
access.get_mut(&key).unwrap().push(value);
}
}