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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
mod par_builder;
mod state_handler;
use super::*;
use par_builder::ParBuilder;
use state_handler::CtxStateHandler;
#[derive(Debug, Default, Clone)]
pub(crate) struct ParFSM {
prev_par: ParResult,
current_par: ParResult,
state_inserter: StateInserter,
state_handler: CtxStateHandler,
par_builder: ParBuilder,
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub enum SubgraphType {
Left,
Right,
}
impl ParFSM {
pub(crate) fn from_left_started(ingredients: MergerParResult, data_keeper: &mut DataKeeper) -> FSMResult<Self> {
let prev_par = ingredients.prev_par.unwrap_or_default();
let current_par = ingredients.current_par.unwrap_or_default();
let state_inserter = StateInserter::from_keeper(data_keeper);
let state_handler = CtxStateHandler::prepare(prev_par, current_par, data_keeper)?;
let par_builder = ParBuilder::from_keeper(data_keeper, &state_inserter);
let par_fsm = Self {
prev_par,
current_par,
state_inserter,
state_handler,
par_builder,
};
par_fsm.prepare_sliders(data_keeper, SubgraphType::Left)?;
Ok(par_fsm)
}
pub(crate) fn left_completed(&mut self, data_keeper: &mut DataKeeper) {
self.par_builder.track(data_keeper, SubgraphType::Left);
self.state_handler.handle_subgraph_end(data_keeper, SubgraphType::Left);
let _ = self.prepare_sliders(data_keeper, SubgraphType::Right);
}
pub(crate) fn right_completed(mut self, data_keeper: &mut DataKeeper) {
self.par_builder.track(data_keeper, SubgraphType::Right);
let state = self.par_builder.build();
self.state_inserter.insert(data_keeper, state);
self.state_handler.handle_subgraph_end(data_keeper, SubgraphType::Right);
}
fn prepare_sliders(&self, data_keeper: &mut DataKeeper, subgraph_type: SubgraphType) -> FSMResult<()> {
let (prev_len, current_len) = match subgraph_type {
SubgraphType::Left => (self.prev_par.left_size, self.current_par.left_size),
SubgraphType::Right => (self.prev_par.right_size, self.current_par.right_size),
};
data_keeper.prev_slider_mut().set_subtrace_len(prev_len as _)?;
data_keeper.current_slider_mut().set_subtrace_len(current_len as _)?;
Ok(())
}
}
use std::fmt;
impl fmt::Display for SubgraphType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
SubgraphType::Left => write!(f, "left"),
SubgraphType::Right => write!(f, "right"),
}
}
}