standing_relations/core/context/
mod.rs1mod handler_queue;
2pub mod input;
3mod tracking;
4
5use std::{cell::RefCell, rc::Rc};
6
7use self::handler_queue::{HandlerPosition, HandlerQueue, IsInputHandler};
8pub use self::tracking::{ContextTracker, TrackingIndex};
9
10#[derive(Default)]
11struct Context<'a> {
12 tracker: ContextTracker,
13 handler_queue: Rc<RefCell<HandlerQueue<'a>>>,
14}
15
16impl<'a> Context<'a> {
17 fn commit(&mut self) {
18 for mut x in self.handler_queue.borrow_mut().take_queued() {
19 x.dump()
20 }
21 }
22 fn handler_queue(&self) -> &Rc<RefCell<HandlerQueue<'a>>> {
23 &self.handler_queue
24 }
25 fn add_handler(&mut self, handler: impl IsInputHandler + 'a) -> HandlerPosition {
26 self.handler_queue.borrow_mut().add_handler(handler)
27 }
28}
29
30#[derive(Default)]
31pub struct CreationContext<'a>(Context<'a>);
32
33pub struct ExecutionContext<'a>(Context<'a>);
34
35impl<'a> CreationContext<'a> {
36 pub fn new() -> Self {
37 Default::default()
38 }
39 pub fn begin(self) -> ExecutionContext<'a> {
40 ExecutionContext(self.0)
41 }
42 pub fn tracker(&self) -> &ContextTracker {
43 &self.0.tracker
44 }
45}
46
47impl<'a> ExecutionContext<'a> {
48 pub fn commit(&mut self) {
49 self.0.commit()
50 }
51 pub fn tracker(&self) -> &ContextTracker {
52 &self.0.tracker
53 }
54}