1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
mod handler_queue;
pub mod input;
mod tracking;

use std::{cell::RefCell, rc::Rc};

use self::handler_queue::{HandlerPosition, HandlerQueue, IsInputHandler};
pub use self::tracking::{ContextTracker, TrackingIndex};

#[derive(Default)]
struct Context<'a> {
    tracker: ContextTracker,
    handler_queue: Rc<RefCell<HandlerQueue<'a>>>,
}

impl<'a> Context<'a> {
    fn commit(&mut self) {
        for mut x in self.handler_queue.borrow_mut().take_queued() {
            x.dump()
        }
    }
    fn handler_queue(&self) -> &Rc<RefCell<HandlerQueue<'a>>> {
        &self.handler_queue
    }
    fn add_handler(&mut self, handler: impl IsInputHandler + 'a) -> HandlerPosition {
        self.handler_queue.borrow_mut().add_handler(handler)
    }
}

#[derive(Default)]
pub struct CreationContext<'a>(Context<'a>);

pub struct ExecutionContext<'a>(Context<'a>);

impl<'a> CreationContext<'a> {
    pub fn new() -> Self {
        Default::default()
    }
    pub fn begin(self) -> ExecutionContext<'a> {
        ExecutionContext(self.0)
    }
    pub fn tracker(&self) -> &ContextTracker {
        &self.0.tracker
    }
}

impl<'a> ExecutionContext<'a> {
    pub fn commit(&mut self) {
        self.0.commit()
    }
    pub fn tracker(&self) -> &ContextTracker {
        &self.0.tracker
    }
}