• Home
  • Blog
  • Projects
  • Bookshelf
  • About
← Back to all snippets

Progressive Identifiers

Published 📅: ....
Last modified 📝: ....
Location 📍: Boston, MA

Share this snippet on BlueskySee discussion on Bluesky


This is a quick and small snippet to generate IDs within JavaScript, and then show a user friendly variant of the ID - similar to change ids within Jujutsu!

class ProgressiveIdManager {
  rawIds = new Set();
  betterIds = new Map();
  
  constructor(generateId = crypto.randomUUID.bind(crypto)) {
    this._generateId = generateId;
  }
  
  getProgressiveId(rawId) {
    let index = 1;
    do {
	  let betterId = id.slice(0, index);
	  if (!this.betterIds.has(betterId)) {
	    betterIds.set(betterId, rawId);
	    return betterId;
	  }
	  index++;
    } while (index < id.length)
    
    // fallback to the original id
    return rawId;
  }
  
  generate() {
    let rawId = this._generateId();
    if (rawIds.has(rawId)) {
      throw new Error(`Generated duplicate id: ${rawId} - this should never happen!`);
    }
    rawIds.add(rawId);
    let progressiveId = this.getProgressiveId(rawId);
    
    return [progressiveId, rawId];
  }
}

let manager = new ProgressiveIdManager();

let [id] = manager.generate();
let [anotherId] = manager.generate();

Tags:

snippetJavaScriptDevelopment

Loading...

Related Posts

snippet

Quick Git

Published: ....

Multi-step Native HTML Forms

Published: ....

Git Co-Authorship

Published: ....

useInterval

Published: ....

JavaScript

Async Class Creation In JavaScript

Published: ....

Have you ever wanted to create a class in JavaScript or TypeScript but also have the initialization be async? Here's a quick tip on a pattern that I've used in the past!

The Bookkeeping Pattern

Published: ....

A quick look at a small but powerful pattern I've been leveraging as of late!

TSLite

Published: ....

A proposal for a minimal variant of TypeScript!

Understanding React 16.3 Updates

Published: ....

A quick overview of the new lifecycle methods introduced in React 16.3

CSS in JS

Published: ....

A few thoughts and patterns for using styled-jsx or other CSS-in-JS solutions

JavaScript Weirdness

Published: ....

A few weird things about JavaScript

Development

Roundup Notes in Obsidian with Dataview

Published: ....

A quick tip for creating roundup or summary notes based on other notes in Obsidian using the Dataview plugin!

Quick Tip - Theme Aware Images

Published: ....

Have you ever found the need to change the image you render on a web page based on the current preferred color scheme of your theme?

Website Redesign v10

Published: ....

I recently launched a rewrite and redesign of this personal website, I figured I'd talk a bit about the changes and new features that I added along the way!

Quick Tip - Specific Local Module Declarations

Published: ....

A quick tip outlining how to provide specific TypeScript type definitions for a local module!

You're Building Software Wrong

Published: ....

Slicing software: why vertical is better than horizontal.

Single File Web Apps

Published: ....

What if you could author an entire web application in a single file?

The AI Development Conundrum

Published: ....

Is it a good or a bad thing to offload writing code to AI agents and Large Language Models?

A Quick Look at Import Maps

Published: ....

A brief look at Import Maps and package.json#imports to support isomorphic JavaScript applications!

Recommended Tech Talks

Published: ....

A collection of tech talks that I regularly re-watch and also recommend to everyone!

Request for a (minimal) RSC Framework

Published: ....

Some features and functionality that I'd like within a React Server Component compatible framework.

Bluesky Tips and Tools

Published: ....

A (running) collection of Bluesky tips, tools, packages, and other misc things!

Building a Custom Ghostty Theme

Published: ....

How to generate a custom Ghostty theme based on any iterm2 theme!

Offload Complexity, Don't Offload Learning

Published: ....

A rough mental model for how you should be leveraging AI as a tool for your own growth

More Thoughts on Dogfooding

Published: ....

Even more thoughts on dogfooding!

Dogfooding

Published: ....

The secret to excellent product teams is using your own product, and often!

Git Notes as a Tool for Thought

Published: ....

(Ab)using Git as yet another tool for thought!

My Current Dev Setup

Published: ....

A quick look at the applications and tools that I (generally) use day to day for web development!

There Is No Standard Markdown

Published: ....

There are a variety of different markdown "standards" out there, and sometimes they're not all that consistent

Tip: Request and Response Headers

Published: ....

There's a common gotcha when creating Web Request and Response instances with Headers!

Using Feature Toggles to De-risk Refactors

Published: ....

Feature toggles are often underused by most software development teams, and yet offer so much value during not only feature development but also refactors

Hohoro

Published: ....

A quick introduction to my new side project, hohoro. An incremental JS/TS library build tool!

Funport: True Dynamic Imports in webpack

Published: ....

webpack, and tools built on it like Next.js, don't support true dynamic imports, but I found a way to trick the system!

My Current AI Stack

Published: ....

I've been using a variety of AI tools as of late, I figured I'd document the ones I'm primarily using!

Configuring Cloudflare Domains with Vercel

Published: ....

I've started to use Cloudflare to manage my domains for several side projects, have had to jump through the same hooks multiple times that I figured I should document them here!

React Error Boundaries: Revisited

Published: ....

Revising my previous blog post on React Error Boundaries and my preferred go-to implementation!

Custom Favicon Recipes

Published: ....

Two neat tricks for enhancing your site's favicon!

Corporate Sponsored OSS

Published: ....

The various risks and pitfalls of open source software run by corporations.

The Library-Docs Monorepo Template

Published: ....

A monorepo template for managing a library and documentation together.

Building Better Beacon

Published: ....

How we solved an almost show-stopping production bug, and how you can avoid it in your own projects.

Churn Anxiety

Published: ....

When did semver major changes become so scary?

Stop Snacking

Published: ....

No I don't mean those Milano cookies you keep taking from the office snack wall either (although you should probably stop snacking on those as often as well).

Pair Programming

Published: ....

Pair programming can be good sometimes - but not all the time

Taking a Break

Published: ....

A few quick thoughts on burn out and taking a break