module Data.ULID.Crockford (encode, decode) where import qualified Codec.Crockford as CR import Text.Read -- source: https://stackoverflow.com/a/29153602 -- I removed the safety for m > length because that should never happen -- and if it does, I want it to crash! leftpad m xs = replicate (m - length xs) '0' ++ xs encode :: Int -> Integer -> String encode width = (leftpad width).(CR.encode) decode :: Int -> ReadS Integer decode width str | length str >= width = let (crock, remainder) = splitAt width str in case CR.decode crock of Nothing -> [] Just c -> [(c, remainder)] | otherwise = []