#![allow(dead_code)] #![allow(unused_variables)] use boomerang::{builder::prelude::*, runtime, Reaction, Reactor}; #[derive(Reactor)] #[reactor(state = "()", reaction = "AReactionX")] struct ABuilder { x: TypedPortKey<(), Input>, y: TypedPortKey<(), Output>, } #[derive(Reaction)] #[reaction(reactor = "ABuilder")] struct AReactionX<'a> { x: runtime::InputRef<'a, ()>, y: runtime::OutputRef<'a, ()>, } impl<'a> Trigger for AReactionX<'a> { fn trigger(self, ctx: &mut runtime::Context, state: &mut ()) {} } #[derive(Reactor)] #[reactor(state = "()", reaction = "BReactionStartup", reaction = "BReactionX")] struct BBuilder { x: TypedPortKey<(), Input>, y: TypedPortKey<(), Output>, } #[derive(Reaction)] #[reaction(reactor = "BBuilder", triggers(port = "x"))] struct BReactionX; impl Trigger for BReactionX { fn trigger(self, ctx: &mut runtime::Context, state: &mut ()) {} } #[derive(Reaction)] #[reaction(reactor = "BBuilder", triggers(startup))] struct BReactionStartup<'a> { y: runtime::OutputRef<'a, ()>, } impl Trigger for BReactionStartup<'_> { fn trigger(self, ctx: &mut runtime::Context, state: &mut ()) {} } #[derive(Reactor)] #[reactor( state = "()", connection(from = "a.y", to = "b.x"), connection(from = "b.y", to = "a.x") )] struct CycleBuilder { #[reactor(child = "()")] a: ABuilder, #[reactor(child = "()")] b: BBuilder, } #[test] fn cycle() { tracing_subscriber::fmt::init(); let _ = boomerang_util::runner::build_and_test_reactor::("cycle", (), true, false) .unwrap(); }