Blame examples/performance/REtest.hs

Packit 5b08af
{-# LANGUAGE BangPatterns#-}
Packit 5b08af
Packit 5b08af
-- ----------------------------------------
Packit 5b08af
Packit 5b08af
module Main(main)
Packit 5b08af
where
Packit 5b08af
Packit 5b08af
import Text.Regex.XMLSchema.Generic
Packit 5b08af
Packit 5b08af
import Control.Arrow
Packit 5b08af
Packit 5b08af
import Data.Maybe
Packit 5b08af
Packit 5b08af
import System.IO                        -- import the IO and commandline option stuff
Packit 5b08af
import System.Environment
Packit 5b08af
Packit 5b08af
-- ----------------------------------------
Packit 5b08af
Packit 5b08af
main    :: IO ()
Packit 5b08af
main
Packit 5b08af
    = do
Packit 5b08af
      p  <- getProgName
Packit 5b08af
      al <- getArgs
Packit 5b08af
      let i = if null al
Packit 5b08af
              then 4
Packit 5b08af
              else (read . head $ al)::Int
Packit 5b08af
      main' p i
Packit 5b08af
    where
Packit 5b08af
    main' p' = fromMaybe main1 . lookup (pn p') $ mpt
Packit 5b08af
    mpt = [ ("REtest",     main1)
Packit 5b08af
          , ("Copy",       main2 "copy"     (:[]))
Packit 5b08af
          , ("Lines",      main2 "lines"    lines)
Packit 5b08af
          , ("RElines",    main2 "relines"  relines)
Packit 5b08af
          , ("SElines",    main2 "selines'" relines')
Packit 5b08af
          , ("Words",      main2 "words"    words)
Packit 5b08af
          , ("REwords",    main2 "rewords"  rewords)
Packit 5b08af
          , ("SEwords",    main2 "sewords"  rewords')
Packit 5b08af
          ]
Packit 5b08af
Packit 5b08af
-- ----------------------------------------
Packit 5b08af
Packit 5b08af
-- generate a document containing a binary tree of 2^i leafs (= 2^(i-1) XML elements)
Packit 5b08af
Packit 5b08af
main1   :: Int -> IO ()
Packit 5b08af
main1 i
Packit 5b08af
    = do
Packit 5b08af
      genDoc i "REtest.hs" (fn i)
Packit 5b08af
      return ()
Packit 5b08af
Packit 5b08af
-- ----------------------------------------
Packit 5b08af
Packit 5b08af
-- read a document containing a binary tree of 2^i leafs
Packit 5b08af
Packit 5b08af
main2   :: String -> (String -> [String]) -> Int -> IO ()
Packit 5b08af
main2 ext lines' i
Packit 5b08af
    = do
Packit 5b08af
      hPutStrLn stderr "start processing"
Packit 5b08af
      h  <- openFile (fn i) ReadMode
Packit 5b08af
      c  <- hGetContents h
Packit 5b08af
      let ls = lines' c
Packit 5b08af
      o  <- openFile (fn i ++ "." ++ ext) WriteMode
Packit 5b08af
      mapM_ (hPutStrLn o) ls
Packit 5b08af
      hClose o
Packit 5b08af
      hClose h
Packit 5b08af
      hPutStrLn stderr "end  processing"
Packit 5b08af
Packit 5b08af
relines         :: String -> [String]
Packit 5b08af
relines         = tokenize ".*"
Packit 5b08af
Packit 5b08af
relines'        :: String -> [String]
Packit 5b08af
relines'        = tokenizeSubex "({line}.*)" >>> map snd
Packit 5b08af
Packit 5b08af
rewords         :: String -> [String]
Packit 5b08af
rewords         = tokenize "\\S+"
Packit 5b08af
Packit 5b08af
rewords'        :: String -> [String]
Packit 5b08af
rewords'        = tokenizeSubex "({word}\\S+)" >>> map snd
Packit 5b08af
Packit 5b08af
-- ----------------------------------------
Packit 5b08af
Packit 5b08af
pn      :: String -> String
Packit 5b08af
pn      = reverse . takeWhile (/= '/') . reverse
Packit 5b08af
Packit 5b08af
fn      :: Int -> String
Packit 5b08af
fn      = ("lines-" ++) . (++ ".txt") . reverse . take 4 . reverse . ((replicate 4 '0') ++ ) . show
Packit 5b08af
Packit 5b08af
-- ----------------------------------------
Packit 5b08af
Packit 5b08af
genDoc          :: Int -> String -> String -> IO ()
Packit 5b08af
genDoc d inp outp
Packit 5b08af
                = do
Packit 5b08af
                  s <- readFile inp
Packit 5b08af
                  let s' = take (2^d) . concat . repeat $ s
Packit 5b08af
                  writeFile outp s'
Packit 5b08af
Packit 5b08af
-- ----------------------------------------