module Main where
import GHC.Conc
import Control.Concurrent.STM

main = do
  x <- mapM go . swapRev =<< mapM (atomically . newTVar) ([1..1000] :: [Int])
  print $ length x
    where go v = forkIO . atomically $ do
                   x <- readTVar v
                   unsafeIOToSTM $ putStr (show x ++ ", ")
                   writeTVar v (x+1)
          swapRev xs = reverse xs ++ xs