use crate::pre_tokenized::PreTokenizedString;
use crate::pre_tokenized::PtSplit;
use super::Error;
pub fn pre_tokenize(pts: &mut PreTokenizedString) -> Result<(), Error> {
let buffer = pts.buffer.as_str();
let old_splits = &pts.splits;
let hint: usize = old_splits.len() << 1; let mut new_splits = Vec::with_capacity(hint);
for split in old_splits {
if split.token_id.is_some() {
new_splits.push(split.clone());
continue;
}
let text = &buffer[split.range.clone()];
if text.is_empty() {
continue;
}
let base = split.range.start;
let mut seg_start = 0usize;
for (i, ch) in text.char_indices() {
if ch.is_whitespace() {
if i > seg_start {
let range = (base + seg_start)..(base + i);
new_splits.push(PtSplit::from_range(range));
}
seg_start = i + ch.len_utf8();
}
}
if seg_start < text.len() {
let range = (base + seg_start)..(base + text.len());
new_splits.push(PtSplit::from_range(range));
}
}
pts.splits = new_splits;
Ok(())
}