module Main where
import Control.Monad (when)
import qualified Data.Map as Map
import Options.Applicative
import qualified Data.PerfectHash.Construction as Construction
import qualified Data.PerfectHash.Lookup as Lookup
import qualified Exercise
defaultDictionaryPath :: FilePath
defaultDictionaryPath = "/usr/share/dict/words"
data DemoOptions = DemoOptions {
dictionaryPath :: FilePath
, debugEnabled :: Bool
}
optionsParser :: Parser DemoOptions
optionsParser = DemoOptions
<$> strOption
( long "dictionary"
<> help "Dictionary path"
<> value defaultDictionaryPath)
<*> switch
( long "debug"
<> help "enable debug mode")
main :: IO ()
main = run =<< execParser opts
where
opts = info (optionsParser <**> helper)
( fullDesc
<> progDesc "Test the hashing on strings"
<> header "string test" )
run (DemoOptions dictionaryPath enableDebug) = do
word_index_tuples <- Exercise.wordsFromFile dictionaryPath
putStrLn $ unwords [
"Words size:"
, show $ length word_index_tuples
]
let lookup_table = Construction.createMinimalPerfectHash $
Map.fromList word_index_tuples
putStrLn $ unwords [
"Finished computing lookup table with"
, show $ Lookup.size lookup_table
, "entries."
]
when enableDebug $ do
putStrLn $ unwords ["Vector G:", show $ Lookup.nonces lookup_table]
putStrLn $ unwords ["Vector V:", show $ Lookup.values lookup_table]
Exercise.eitherExit $ Exercise.testPerfectLookups lookup_table $
Map.fromList word_index_tuples