pub fn splitn<D: AsRef<[u8]>>(n: usize, data: &D, seperator: impl AsRef<[u8]>) -> Vec<&[u8]> {
let sep = seperator.as_ref();
let mut data = data.as_ref();
let mut buf = Vec::with_capacity(n);
while let Some(pos) = scan(data, sep) {
if buf.len() + 1 == n {
break;
}
let (split, rest) = data.split_at(pos);
buf.push(split);
data = rest.split_at(sep.len()).1;
}
buf.push(data);
buf
}
pub fn split<D: AsRef<[u8]>>(data: &D, seperator: impl AsRef<[u8]>) -> Vec<&[u8]> {
let sep = seperator.as_ref();
let mut data = data.as_ref();
let mut buf = Vec::new();
while let Some(pos) = scan(data, sep) {
let (split, rest) = data.split_at(pos);
buf.push(split);
data = rest.split_at(sep.len()).1;
}
buf.push(data);
buf
}
pub fn scan(data: impl AsRef<[u8]>, pattern: impl AsRef<[u8]>) -> Option<usize> {
let data: &[u8] = data.as_ref();
let pat: &[u8] = pattern.as_ref();
if pat.len() > data.len() {
return None;
}
let mut found = 0usize;
for (i, &d) in data.iter().enumerate() {
if d == pat[found] {
found += 1;
if found == pat.len() {
return Some(i + 1 - pat.len());
}
} else {
found = 0;
}
}
None
}