I wrote the grapheme break functions. It didn't occur to me that it would be
useful to return anything, because usually the breakpoints are scanned to
find good places to break, and usually those are pretty common.
It's probably not a common use case (otherwise someone would have said the same thing about the _wordbreaks series already), but I'll elaborate a little bit to help demonstrate an applicable scenario.
The strings my functions operate on are arrays in memory with associated link counts. The original code used random access to perform string manipulation, but that's not a valid approach when n_bytes != n_codepoints (non-ASCII). The new approach I'm using is to pre-generate the grapheme breaks when the string is instantiated (u8_wordbreaks). This way the break positions are only calculated once across the life of that string. Knowing the grapheme count is beneficial here as the operation can be immediately rejected without an additional scan.
If the string is modified, that instantiates a completely new string and reduces the link count of the string that was operated on by one. (potentially freeing the old string and its associated grapheme breaks array)