mole-0.0.5: src/Data/Mole/Builder/Internal/Fingerprint.hs
{-# LANGUAGE OverloadedStrings #-}
module Data.Mole.Builder.Internal.Fingerprint
( contentHash
, fingerprint
) where
import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import Data.Word
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import Crypto.Hash.SHA3
import System.FilePath
contentHash :: ByteString -> Text
contentHash body = T.decodeUtf8 $ BS.map (\x -> alnum $ rem x 62) $ hash 512 body
where
alnum :: Word8 -> Word8
alnum x
| x < 26 = ((x ) + 65)
| x < 52 = ((x - 26) + 97)
| x < 62 = ((x - 52) + 48)
| otherwise = error $ "Out of range: " ++ show x
fingerprint :: ByteString -> String -> Text
fingerprint body name = mconcat
[ T.take prefixLength h
, "-"
, T.pack (takeBaseName name)
, "-"
, T.drop prefixLength h
, T.pack (takeExtension name)
]
where
h = contentHash body
prefixLength = 9