Skip to main content

solverforge_solver/phase/
sequence.rs

1use 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    pub fn into_phases(self) -> Vec<P> {
23        self.phases
24    }
25}
26
27impl<P: Debug> Debug for PhaseSequence<P> {
28    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
29        f.debug_struct("PhaseSequence")
30            .field("phases", &self.phases)
31            .finish()
32    }
33}
34
35impl<S, D, ProgressCb, P> Phase<S, D, ProgressCb> for PhaseSequence<P>
36where
37    S: PlanningSolution,
38    D: Director<S>,
39    ProgressCb: ProgressCallback<S>,
40    P: Phase<S, D, ProgressCb>,
41{
42    fn solve(&mut self, solver_scope: &mut SolverScope<'_, S, D, ProgressCb>) {
43        for phase in &mut self.phases {
44            phase.solve(solver_scope);
45        }
46    }
47
48    fn phase_type_name(&self) -> &'static str {
49        "PhaseSequence"
50    }
51}