extern crate alloc;
pub use nullable_utils_macros::*;
pub use crate::output::Listener as OutputListener;
pub use crate::output::Tracker as OutputTracker;
mod output;
#[derive(Clone, Debug)]
pub enum NulledResponses<T> {
Repeating(T),
Sequence(alloc::vec::Vec<T>),
}
impl<T> NulledResponses<T> {
pub fn backmap<U>(self, mut mapper: impl FnMut(T) -> U) -> NulledResponses<U> {
match self {
Self::Repeating(response) => NulledResponses::Repeating(mapper(response)),
Self::Sequence(responses) => {
NulledResponses::Sequence(responses.into_iter().map(mapper).collect())
}
}
}
}
impl<T> NulledResponses<T>
where
T: Clone,
{
pub fn get(&mut self) -> T {
match self {
Self::Repeating(response) => response.clone(),
Self::Sequence(responses) => responses.pop().expect("not enough responses configured"),
}
}
}
impl<T, const N: usize> From<[T; N]> for NulledResponses<T> {
fn from(value: [T; N]) -> Self {
Self::from(Vec::from(value))
}
}
impl<T> From<&[T]> for NulledResponses<T>
where
T: Clone,
{
fn from(value: &[T]) -> Self {
Self::from(Vec::from(value))
}
}
impl<T> From<T> for NulledResponses<T>
where
T: Clone,
{
fn from(value: T) -> Self {
Self::Repeating(value)
}
}
impl<T> From<Vec<T>> for NulledResponses<T> {
fn from(mut value: Vec<T>) -> Self {
value.reverse();
Self::Sequence(value)
}
}