1use std::{cell::RefCell, rc::Rc};
5
6use crate::prelude::*;
7
8#[derive(Default)]
13pub struct YesTick {
14 pub ticked: bool,
15}
16
17impl YesTick {
18 pub fn action<T>() -> Node<T> {
19 Node::stateful_action("yes", Box::new(YesTick::default()))
20 }
21}
22
23impl<T> StatefulAction<T> for YesTick {
24 fn tick(&mut self, _data: &mut T) -> Status {
25 self.ticked = true;
26 Status::Success
27 }
28
29 fn reset(&mut self) {
30 }
32}
33
34impl Drop for YesTick {
35 fn drop(&mut self) {
36 assert!(self.ticked, "YesTick dropped without being ticked");
37 }
38}
39
40#[derive(Default)]
44pub struct NoTick;
45
46impl NoTick {
47 pub fn action<T>() -> Node<T> {
48 Node::stateful_action("no", Box::new(NoTick::default()))
49 }
50}
51
52impl<T> StatefulAction<T> for NoTick {
53 fn tick(&mut self, _data: &mut T) -> Status {
54 panic!("NoTick node should never be ticked");
55 }
56
57 fn reset(&mut self) {
58 }
60}
61
62pub struct AlwaysRunning;
64
65impl AlwaysRunning {
66 pub fn action<T>() -> Node<T> {
67 Node::action("running", |_| Status::Running)
68 }
69}
70
71pub struct ConstAction {
74 pub return_status: Rc<RefCell<Status>>,
75}
76
77impl ConstAction {
78 pub fn new(status: Status) -> Self {
79 Self {
80 return_status: Rc::new(RefCell::new(status)),
81 }
82 }
83}
84
85impl<T> StatefulAction<T> for ConstAction {
86 fn tick(&mut self, _data: &mut T) -> Status {
87 *self.return_status.borrow()
88 }
89
90 fn reset(&mut self) {}
91}
92#[derive(Default)]
103pub struct Counter {
104 pub value: Rc<RefCell<i32>>,
105 resettable: bool,
106}
107
108impl Counter {
109 pub fn action<T>(resettable: bool) -> (Rc<RefCell<Node<T>>>, Rc<RefCell<i32>>) {
110 let value = Rc::new(RefCell::new(0));
111 (
112 Rc::new(RefCell::new(Node::stateful_action(
113 "counter",
114 Box::new(Self {
115 value: value.clone(),
116 resettable,
117 }),
118 ))),
119 value,
120 )
121 }
122}
123
124impl<T> StatefulAction<T> for Counter {
125 fn tick(&mut self, _data: &mut T) -> Status {
126 *self.value.borrow_mut() += 1;
127 Status::Success
128 }
129
130 fn reset(&mut self) {
131 if self.resettable {
132 *self.value.borrow_mut() = 0;
133 }
134 }
135}