content: 
  module Progress 
          ( printPosition
          , printProgress
          , padR
          , padL)
  where
  import System.IO
  import Control.Monad
  
  
  -- | Print position in a stream, without a maximum value.
  printPosition :: Bool -> String -> Int -> Int -> IO ()
  printPosition isLast header block pos
   | pos == 0
   = do   putStr $ header ++ padR 10 (show pos)
          hFlush stdout
  
   | pos `mod` block == 0 || isLast
   = do   putStr $ replicate (length header + 10) '\b'
          putStr $ header ++ padR 10 (show pos)
          when isLast
           $ putStr "\n"
          hFlush stdout
  
   | otherwise
   =      return ()
  
  
  -- | Print progress in a stream towards a maximum value.
  printProgress :: String -> Int -> Int -> Int -> IO ()
  printProgress header block pos len
   | pos == 0
   = do   putStr $ header ++ padR 10 (show $ pos) ++ "/" ++ padR 10 (show len)
          hFlush stdout
  
   |   pos `mod` block == 0 || pos == len
   = do   let n   = length header + 21
          putStr  $ replicate n '\b'
          putStr $ header ++ padR 10 (show $ pos) ++ "/" ++ padR 10 (show len)
          when (pos == len)
           $ putStr "\n"
          hFlush stdout
  
   | otherwise
   =      return ()
  
  
  -- | Pretty print in a right-justified column.
  padR :: Int -> String -> String
  padR n str
   = replicate (n - length str) ' ' ++ str
  
  
  -- | Pretty print in a left-justified column.
  padL :: Int -> String -> String
  padL n str
   = str ++ replicate (n - length str) ' '
  