use dynamo_tokens::TokenBlockSequence;
use super::config::DEFAULT_TEST_BLOCK_SIZE;
use crate::BlockId;
use crate::KvbmSequenceHashProvider;
use crate::pools::SequenceHash;
pub struct BlockSequenceBuilder {
tokens: Vec<u32>,
salt: Option<dynamo_tokens::SaltHash>,
block_size: usize,
}
impl BlockSequenceBuilder {
pub fn from_tokens(tokens: Vec<u32>) -> Self {
Self {
tokens,
salt: None,
block_size: DEFAULT_TEST_BLOCK_SIZE,
}
}
pub fn with_block_size(mut self, size: usize) -> Self {
use super::config::validate_test_block_size;
assert!(
validate_test_block_size(size),
"Invalid block size: {}. Must be power of 2 between 1 and 1024",
size
);
self.block_size = size;
self
}
pub fn with_salt(mut self, salt: dynamo_tokens::SaltHash) -> Self {
self.salt = Some(salt);
self
}
pub fn build(self) -> Vec<(BlockId, SequenceHash)> {
assert_eq!(
self.tokens.len() % self.block_size,
0,
"Token count {} must be divisible by block size {}",
self.tokens.len(),
self.block_size
);
let token_seq =
TokenBlockSequence::from_slice(&self.tokens, self.block_size as u32, self.salt);
token_seq
.blocks()
.iter()
.enumerate()
.map(|(idx, tb)| (idx as BlockId, tb.kvbm_sequence_hash()))
.collect()
}
}