use crate::word::{Word, WordLike, Words};
use core::fmt::Debug;
pub trait WordCollector: Debug {
type FinalizeResult;
fn push<W: Word, const N: usize, U: WordLike<W, N>>(&mut self, word: U);
fn finalize(self) -> Self::FinalizeResult;
}
#[derive(Clone, Debug, PartialEq, Eq)]
#[repr(transparent)]
pub struct OwnedWordCollector {
words: Words,
}
impl OwnedWordCollector {
pub fn new() -> Self {
return Self {
words: Words::new(),
};
}
pub fn wrap(words: Words) -> Self {
return Self { words };
}
pub fn words(&self) -> &Words {
return &self.words;
}
}
impl WordCollector for OwnedWordCollector {
type FinalizeResult = Words;
fn push<W: Word, const N: usize, U: WordLike<W, N>>(&mut self, word: U) {
self.words.as_vec_mut().extend(word.to_word().to_le_words());
}
fn finalize(self) -> Words {
return self.words;
}
}
impl Default for OwnedWordCollector {
fn default() -> Self {
return Self::new();
}
}
#[derive(Clone, Copy, Debug)]
pub struct WordDiscarder;
impl WordCollector for WordDiscarder {
type FinalizeResult = ();
fn push<W: Word, const N: usize, U: WordLike<W, N>>(&mut self, _word: U) {}
fn finalize(self) {}
}
impl Default for WordDiscarder {
fn default() -> Self {
return Self;
}
}