Generating prefixed base62 encoded UUIDs in ReScript

module Base62 = {
  let alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
  let alphabetLength = alphabet->String.length->BigInt.fromInt
  let base62UUIDLength = 22

  let rec encode = number => {
    if number < alphabetLength {
      alphabet->String.getUnsafe(number->BigInt.toInt)
    } else {
      open! BigInt
      encode(number / alphabetLength) ++ encode(BigInt.mod(number, alphabetLength))
    }
  }

  let bigIntFromHexExn = string => BigInt.fromStringExn(`0x${string}`)

  let encodeUUID = uuid => {
    uuid
    ->String.replaceAll("-", "")
    ->bigIntFromHexExn
    ->encode
    ->String.padStart(base62UUIDLength, "0")
  }
}

module Browser = {
  module Crypto = {
    @val @scope("crypto")
    external randomUUID: unit => string = "randomUUID"
  }
}

let generate = (~prefix) => {
  let uuid = Browser.Crypto.randomUUID()
  `${prefix}_${uuid->Base62.encodeUUID}`
}