pub struct MoveSelectorIter<S, M, C>
where
S: PlanningSolution,
M: Move<S>,
C: MoveCursor<S, M>,
{
cursor: C,
_phantom: PhantomData<(fn() -> S, fn() -> M)>,
}
impl<S, M, C> MoveSelectorIter<S, M, C>
where
S: PlanningSolution,
M: Move<S>,
C: MoveCursor<S, M>,
{
fn new(cursor: C) -> Self {
Self {
cursor,
_phantom: PhantomData,
}
}
}
impl<S, M, C> Iterator for MoveSelectorIter<S, M, C>
where
S: PlanningSolution,
M: Move<S>,
C: MoveCursor<S, M>,
{
type Item = M;
fn next(&mut self) -> Option<Self::Item> {
let index = {
let (index, _) = self.cursor.next_candidate()?;
index
};
Some(self.cursor.take_candidate(index))
}
}
pub trait MoveSelector<S: PlanningSolution, M: Move<S>>: Send + Debug {
type Cursor<'a>: MoveCursor<S, M> + 'a
where
Self: 'a;
fn open_cursor<'a, D: Director<S>>(&'a self, score_director: &D) -> Self::Cursor<'a>;
fn iter_moves<'a, D: Director<S>>(
&'a self,
score_director: &D,
) -> MoveSelectorIter<S, M, Self::Cursor<'a>> {
MoveSelectorIter::new(self.open_cursor(score_director))
}
fn size<D: Director<S>>(&self, score_director: &D) -> usize;
fn append_moves<D: Director<S>>(&self, score_director: &D, arena: &mut MoveArena<M>) {
let mut cursor = self.open_cursor(score_director);
for index in collect_cursor_indices::<S, M, _>(&mut cursor) {
arena.push(cursor.take_candidate(index));
}
}
fn is_never_ending(&self) -> bool {
false
}
}