{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS -Wall #-}
import Control.Monad
import Data.ByteString.Base16
import Data.ByteString.Char8 as Strict
import Data.ByteString.Short
import Data.IORef
import Data.Map.Strict
import Text.Printf
import DFINITY.RadixTree
type SimpleTree = RadixTree (IORef (Map ByteString ByteString))
-- |
-- Demonstrate the radix tree structure.
main :: IO ()
main = do
-- Create an empty radix tree.
ref <- newIORef mempty
tree <- createRadixTree 2048 Nothing ref
printf "Empty\n"
printRadixTree tree
-- Insert key-value pairs into the radix tree.
tree' <- foldM
step
tree
[ ("cat" , "dog")
, ("cats" , "ends in s")
, ("catalog" , "extends cat")
, ("catalogs" , "ends in s")
, ("cataloging", "ends in ing")
]
-- Merkleize the radix tree.
(root, tree'') <- merkleizeRadixTree tree'
printf "Merkleize\n"
printRadixTree tree''
let pretty = show . encode . fromShort
printf "state root = %s\n" $ pretty root
-- |
-- Insert a key-value pair into the radix tree.
step :: SimpleTree -> (ByteString, ByteString) -> IO SimpleTree
step tree (key, value) = do
printf "Insert %s %s\n" key' value'
tree' <- insertRadixTree key value tree
printRadixTree tree'
return tree'
where
key' = show key
value' = show value