solverforge_solver/phase/
sequence.rs1use std::fmt::{self, Debug};
2
3use solverforge_core::domain::PlanningSolution;
4use solverforge_scoring::Director;
5
6use crate::phase::Phase;
7use crate::scope::{ProgressCallback, SolverScope};
8
9pub struct PhaseSequence<P> {
10 phases: Vec<P>,
11}
12
13impl<P> PhaseSequence<P> {
14 pub fn new(phases: Vec<P>) -> Self {
15 Self { phases }
16 }
17
18 pub fn phases(&self) -> &[P] {
19 &self.phases
20 }
21}
22
23impl<P: Debug> Debug for PhaseSequence<P> {
24 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25 f.debug_struct("PhaseSequence")
26 .field("phases", &self.phases)
27 .finish()
28 }
29}
30
31impl<S, D, ProgressCb, P> Phase<S, D, ProgressCb> for PhaseSequence<P>
32where
33 S: PlanningSolution,
34 D: Director<S>,
35 ProgressCb: ProgressCallback<S>,
36 P: Phase<S, D, ProgressCb>,
37{
38 fn solve(&mut self, solver_scope: &mut SolverScope<'_, S, D, ProgressCb>) {
39 for phase in &mut self.phases {
40 phase.solve(solver_scope);
41 }
42 }
43
44 fn phase_type_name(&self) -> &'static str {
45 "PhaseSequence"
46 }
47}