hbs2/hbs2-share/src/HBS2/Share/LocalHash.hs

39 lines
1.0 KiB
Haskell

module HBS2.Share.LocalHash where
import HBS2.Prelude.Plated
import HBS2.Defaults (defBlockSize)
import HBS2.Hash
import HBS2.Data.Types.Refs
import HBS2.Storage.Operations.ByteString
import HBS2.Share.App.Types
import Data.ByteArray.Hash (SipHash(..), SipKey(..))
import Data.ByteArray.Hash qualified as BA
import Streaming.Prelude qualified as S
import Data.ByteString.Lazy qualified as LBS
import Codec.Serialise
newtype LocalHash = LocalHash { fromLocalHash :: Hash HbSync }
deriving stock (Eq,Ord,Data,Generic,Show)
instance Serialise LocalHash
instance Pretty LocalHash where
pretty (LocalHash h) = pretty h
localHash :: MonadUnliftIO m => FilePath -> m LocalHash
localHash fp = do
liftIO $ withBinaryFile fp ReadMode $ \h -> do
lbs <- LBS.hGetContents h
readChunkedBS lbs defBlockSize
& S.map LBS.toStrict
& S.map (\z -> let (SipHash w) = BA.sipHash sk0 z in w)
& S.toList_
<&> serialise
<&> LocalHash . hashObject @HbSync
where
sk0 = SipKey 5401424299739428297 3116460833428128256