text-trie-0.2.5.0: test/TrieFile/Text.hs
{-# OPTIONS_GHC -Wall -fwarn-tabs #-}
----------------------------------------------------------------
-- ~ 2019.04.03
-- |
-- Module : TrieFile.Text
-- Copyright : Copyright (c) 2008--2009 wren gayle romano, 2019 michael j. klein
-- License : BSD3
-- Maintainer : lambdamichael@gmail.com
-- Stability : experimental
--
-- Example program to read each line from a file (e.g. @/usr/dict@)
-- into a trie. Used to benchmark the naive algorithm against the
-- optimized C. Also used to verify correctness of C implementation,
-- and Trie implementation in general.
----------------------------------------------------------------
module TrieFile.Text (test, readTrieFromFile) where
import qualified Data.Trie.Text as Tr
import qualified Data.Trie.Text.Internal as Tr
import qualified Data.Text.IO as T
import qualified Data.Foldable as F
{-
import Microbench
import Control.Exception (evaluate)
-- -}
import System.IO (withFile, IOMode(..), hIsEOF)
import System.Environment (getArgs)
----------------------------------------------------------------
-- Broken out for manual use in GHCi
readTrieFromFile :: FilePath -> IO (Tr.Trie Int)
readTrieFromFile file = withFile file ReadMode $ \h ->
let go i t = do { b <- hIsEOF h
; if b
then return t
else do { line <- T.hGetLine h
; (go $! i+1) $! Tr.insert line i t
}
}
in go 0 Tr.empty
test :: IO ()
test = do
args <- getArgs
case args of
[] -> putStrLn "No Trie file to benchmark"
file:_ -> do
t <- readTrieFromFile file -- >>= evaluate
-- `sort`
-- S.putStrLn . S.unlines . Tr.keys $ t
-- `wc -l`
-- putStrLn . show . Tr.size $ t
{- -- Tests for comparing inferred foldl/foldr vs hand-written version
microbench "List.foldr elems" $ do
vs <- return $! Tr.elems t
n <- return $! foldr (\v r -> v `seq` (1+) $! r) (0::Int) vs
n `seq` (return () :: IO ())
microbench "Trie.foldr @elems" $ do
t' <- return $! t
n <- return $! F.foldr (\v r -> v `seq` (1+) $! r) (0::Int) t'
n `seq` (return () :: IO ())
microbench "Trie.foldl @elems" $ do
t' <- return $! t
n <- return $! F.foldl (\r v -> v `seq` (1+) $! r) (0::Int) t'
n `seq` (return () :: IO ())
-- -}
-- {- -- verify associativity of folds
putStrLn . show . take 20 . F.foldr (:) [] $ t
putStrLn . show . take 20 . Tr.foldrWithKey (const (:)) [] $ t
putStrLn . show . take 20 . F.foldl (flip (:)) [] $ t
-- -}
----------------------------------------------------------------
----------------------------------------------------------- fin.