use super::family_gpt::{cls, contractions};
use crate::{CODE_CONT, Out, Span, blocks, emit, to_lead};
#[must_use]
pub fn bitcannon_byte_level(
text: &[u8],
tags: &[u8],
starts: &mut [u64],
_flag: &mut [u64],
out: &mut [Span],
) -> usize {
let ntext = text.len();
if ntext == 0 {
return 0;
}
let nblk = ntext.div_ceil(64);
assert!(tags.len() >= ntext && starts.len() >= nblk && out.len() >= ntext);
let mut carry = (0u64, 0u64);
blocks(
ntext,
&mut *starts,
None,
CODE_CONT,
|base, len, seed| cls(text, tags, base, len, seed),
|x, _| {
let (cur, bk) = (&x.cur, &x.bk);
let (steal, patch) = to_lead(cur.ws & x.lb & !x.eof & !x.fw.ws, cur.cont, x.pv.cont);
let mut st = ((cur.l & !bk.l & !bk.sp)
| (cur.n & !bk.n & !bk.sp)
| (cur.other & !bk.other & !bk.sp)
| (cur.ws & !bk.ws)
| steal)
& cur.lead;
if x.bi == 0 {
st |= 1;
}
let (opens, inner) = contractions(text, st, cur.apo, x.base, ntext, false, &mut carry);
st = (st & !inner) | opens;
Out { st, patch, flag: 0 }
},
);
emit(starts, &[], nblk, ntext, out)
}