dfinity-radix-tree-0.4.0: src/Network/DFINITY/RadixTree/Utilities.hs
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS -Wall #-}
module Network.DFINITY.RadixTree.Utilities
( createPrefix
, createRoot
, createRootFromNonce
, defaultRoot
) where
import Codec.Serialise (serialise)
import Data.ByteString.Short (toShort)
import Data.Default.Class (def)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as LBS
import qualified Data.ByteString.Builder as Builder
import qualified Crypto.Hash.BLAKE2.BLAKE2s as Blake2s
import Network.DFINITY.RadixTree.Bits
import Network.DFINITY.RadixTree.Types
createPrefix :: [Bool] -> Maybe RadixPrefix
createPrefix bits =
if null bits
then Nothing
else Just $ fromBits bits
createRoot :: RadixNode -> RadixRoot
createRoot = toShort . blake2s_hashlazy 20 . serialise
createRootFromNonce :: Word -> RadixRoot
createRootFromNonce
= toShort
. Blake2s.hash 20 mempty
. LBS.toStrict
. Builder.toLazyByteString
. Builder.wordDec
defaultRoot :: RadixRoot
defaultRoot = createRoot def
blake2s_hashlazy :: Int -> LBS.ByteString -> BS.ByteString
blake2s_hashlazy size
= Blake2s.finalize size
. LBS.foldlChunks (flip Blake2s.update) (Blake2s.initialize size)