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 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}