export type GlyphHash = GlyphHashFragment[]; type GlyphHashFragment = { glyph: string; color: string; }; const internals = { kDehyphenRegex: /[-]/g, kSplitterRegex: /.{1,8}/g, kGlyphs: ['☽', '☆', '♢', '♡', '╱', '╲', '╳', '〰', '▷', '⏊', '〒', '▢', '◯', '⏃', '⏀', '⏆'], unexpectedUUIDLength: class UnexpectedUUIDLength extends Error { name = 'UnexpectedUUIDLength'; message = 'The provided string was not a valid UUIDv4, please provide a 32 character long string'; } }; // Return a glyph with color based on a 4 byte fragment of a UUIDv4 const getGlyphHashFragment = function (uuidFragment: string): GlyphHashFragment { const glyphIndex = parseInt(uuidFragment.substring(0, 2), 16) % 16; return { glyph: internals.kGlyphs[glyphIndex], color: `#${uuidFragment.substring(2, 8)}` }; }; // Return an array of glyphs based on a UUIDv4 export const getGlyphHash = function (uuid: string): GlyphHash { const dehyphenedUuid = uuid.replace(/[-]/g, ''); if (dehyphenedUuid.length !== 32) { throw new internals.unexpectedUUIDLength(); } const hashFragments = dehyphenedUuid.match(internals.kSplitterRegex); return hashFragments.map(getGlyphHashFragment); };