{-# LANGUAGE PackageImports #-} module Main where import "async" Control.Concurrent.Async ( async, wait ) import "base" Control.Concurrent ( threadDelay ) import "base" Control.Monad ( forM_ ) import "base" Data.Functor ( void ) import "random" System.Random ( randomRIO ) import "terminal-progress-bar" System.ProgressBar main :: IO () main = do example 60 (13 + 60) 25000 exampleAsync 60 (13 + 60) 25000 exampleAsync2 (13 + 100) 25000 example :: Integer -> Integer -> Int -> IO () example todo width delay = do forM_ [1 .. todo] $ \done -> do autoProgressBar percentage exact width $ Progress done todo threadDelay delay putStrLn "" exampleAsync :: Integer -> Integer -> Int -> IO () exampleAsync todo width delay = do (pr, a) <- startProgress percentage exact width $ Progress 0 todo forM_ [1 .. todo] $ \_done -> do incProgress pr 1 threadDelay delay wait a putStrLn "" exampleAsync2 :: Integer -> Int -> IO () exampleAsync2 width delay = do (pr, a) <- startProgress percentage exact width $ Progress 0 todo -- Spawn some threads which each increment progress a bit. forM_ [1 .. numThreads] $ \_ -> void $ async $ forM_ [1 .. progressPerThread] $ \_ -> do incProgress pr 1 d <- randomRIO (delay * numThreads, 2 * delay * numThreads) threadDelay d -- Wait until the task is completed. wait a putStrLn "" where todo :: Integer todo = fromIntegral $ numThreads * progressPerThread numThreads :: Int numThreads = 10 progressPerThread :: Int progressPerThread = 10