/** * Shared Intl object instances with lazy initialization. * * Intl constructors are expensive (~0.05-0.1ms each), so we cache instances * for reuse across the codebase instead of creating new ones each time. * Lazy initialization ensures we only pay the cost when actually needed. */ // Segmenters for Unicode text processing (lazily initialized) let graphemeSegmenter: Intl.Segmenter | null = null export function getGraphemeSegmenter(): Intl.Segmenter { if (!graphemeSegmenter) { graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme', }) } return graphemeSegmenter } /** * Extract the first grapheme cluster from a string. * Returns '' for empty strings. */ export function firstGrapheme(text: string): string { if (!text) return '' const segments = getGraphemeSegmenter().segment(text) const first = segments[Symbol.iterator]().next().value return first?.segment ?? '' } /** * Extract the last grapheme cluster from a string. * Returns '' for empty strings. */ export function lastGrapheme(text: string): string { if (!text) return '' let last = '' for (const { segment } of getGraphemeSegmenter().segment(text)) { last = segment } return last }