-- | Implementation of base-62 encoding, which we use when computing hashes
-- for fully instantiated unit ids.
module Distribution.Utils.Base62 (hashToBase62) where

import Data.Char (chr)
import GHC.Fingerprint (Fingerprint (..), fingerprintString)
import Numeric (showIntAtBase)

-- | Hash a string using GHC's fingerprinting algorithm (a 128-bit
-- MD5 hash) and then encode the resulting hash in base 62.
hashToBase62 :: String -> String
hashToBase62 s = showFingerprint $ fingerprintString s
  where
    showIntAtBase62 x = showIntAtBase 62 representBase62 x ""
    representBase62 x
      | x < 10 = chr (48 + x)
      | x < 36 = chr (65 + x - 10)
      | x < 62 = chr (97 + x - 36)
      | otherwise = '@'
    showFingerprint (Fingerprint a b) = showIntAtBase62 a ++ showIntAtBase62 b
