{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE RecordWildCards #-}
{-# OPTIONS -Wall #-}
module Main where
import Control.Monad (foldM)
import Control.Monad.IO.Class (MonadIO(..))
import Control.Monad.Trans.Resource (runResourceT)
import Crypto.Hash.SHA256 (hash)
import Data.ByteString.Char8 (ByteString, pack)
import Data.Default.Class (Default(..))
import System.Console.CmdArgs (Data, cmdArgs)
import Network.DFINITY.RadixTree
data Args
= Args
{ database :: FilePath
} deriving Data
instance Default Args where
def = Args "benchmark/benchmarkdb"
step
:: MonadIO m
=> (RadixTree -> ByteString -> m RadixTree)
-> RadixTree
-> Int
-> m RadixTree
step action tree i =
if mod i 1000 == 0
then merkleizeRadixTree tree >>= flip action key . snd
else action tree key
where key = hash $ pack $ show i
foldInsert
:: MonadIO m
=> RadixTree
-> [Int]
-> m RadixTree
foldInsert = foldM $ step $ flip $ \ key -> insertRadixTree key key
foldDelete
:: MonadIO m
=> RadixTree
-> [Int]
-> m RadixTree
foldDelete = foldM $ step $ flip deleteRadixTree
main :: IO ()
main = do
Args {..} <- cmdArgs def
runResourceT $ do
tree <- createRadixTree 1048576 6144 database Nothing
tree' <- foldInsert tree keys
tree'' <- foldDelete tree' keys
liftIO $ print $ isEmptyRadixTree tree''
where keys = [1..1000000]