use serde::Serialize;
#[derive(Debug, Clone, Copy, PartialEq, Serialize)]
pub enum SearchDirection {
Forward,
Backward,
}
pub fn find_in_direction<T, F, R>(
items: &[T],
current_index: usize,
direction: SearchDirection,
predicate: F,
) -> Option<(usize, R)>
where
F: Fn(&T) -> Option<R>,
{
match direction {
SearchDirection::Forward => items
.iter()
.enumerate()
.skip(current_index + 1)
.find_map(|(i, item)| predicate(item).map(|res| (i, res))),
SearchDirection::Backward => items[..current_index]
.iter()
.enumerate()
.rev()
.find_map(|(i, item)| predicate(item).map(|res| (i, res))),
}
}