clustr
Version:
Stream UTF-8 bytes and read grapheme clusters safely
1 lines • 781 B
JavaScript
function e(e,t){if(e?.aborted){t?.();let n=Error(`Operation canceled`);throw n.name=e?.reason,n}}function t(t,n){let r=new Intl.Segmenter(void 0,{granularity:`grapheme`}),i=new TextDecoder(`utf-8`,{fatal:!1}),a=n?.signal;return async function*(){let n=``;for(;;){e(a,t.close);let{done:o,value:s}=await new Promise((e,n)=>{a?.addEventListener(`abort`,()=>{t.close?.();let e=Error(`Operation canceled`);e.name=a.reason,n(e)},{once:!0}),Promise.resolve(t.read()).then(e).catch(n)});n+=i.decode(s,{stream:!0});let c=r.segment(n);if(o){for(let n of c)e(a,t.close),yield n.segment;return}let l=c[Symbol.iterator](),u=0,d=l.next();for(;!d.done;){e(a,t.close);let n=l.next();if(n.done)break;u=n.value.index,yield d.value.segment,d=n}o||(n=n.slice(u))}}()}export{t as readGraphemeClusters};