{-# OPTIONS -Wall #-}

module Network.DFINITY.RadixTree.Utilities
   ( createPrefix
   , createRoot
   , createRootFromNonce
   , defaultRoot
   ) where

import Codec.Serialise (serialise)
import Crypto.Hash.SHA256 (hashlazy)
import Data.ByteString.Builder (toLazyByteString, wordDec)
import Data.ByteString.Char8 as Byte (take)
import Data.ByteString.Short (toShort)
import Data.Default.Class (def)

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 . Byte.take 20 . hashlazy . serialise

createRootFromNonce :: Word -> RadixRoot
createRootFromNonce = toShort . Byte.take 20 . hashlazy . toLazyByteString . wordDec

defaultRoot :: RadixRoot
defaultRoot = createRoot def