summaryrefslogtreecommitdiff
path: root/libraries/compact/tests/compact_threads.hs
blob: 99d6fe240914406e0da2d1f70b8a487bfa428ca9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import Control.Concurrent
import Control.Monad
import Data.Compact
import Data.Compact.Internal
import qualified Data.Map as Map
import Data.Maybe
import System.Environment

main = do
  [n] <- map read <$> getArgs
  c <- compact ()
  as <- forM [1..(n::Int)] $ \i -> async (compactAdd c (Just i))
  bs <- forM as $ \a -> async (getCompact <$> takeMVar a)
  xs <- mapM takeMVar bs
  print (sum (catMaybes xs))

async :: IO a -> IO (MVar a)
async io = do
  m <- newEmptyMVar
  forkIO (io >>= putMVar m)
  return m