{ lib }:

let
  chrs = lib.listToAttrs (lib.imap (i: v: {name=v; value=i + 96;}) lib.lowerChars);
  ord = c: builtins.getAttr c chrs;

in {
  # Make a unique UID from a 4-char identifier
  mkUid = id: let  # TODO: Assert length
    chars = lib.stringToCharacters id;
    n = builtins.map (c: lib.mod (ord c) 10) chars;
    s = builtins.concatStringsSep "" (builtins.map (i: builtins.toString i) n);

  in
    assert lib.length chars == 4;
    1000 + lib.toInt s;
}