Skip to content

Instantly share code, notes, and snippets.

@tmhedberg
Created November 18, 2012 12:46
Show Gist options
  • Save tmhedberg/4105055 to your computer and use it in GitHub Desktop.
Save tmhedberg/4105055 to your computer and use it in GitHub Desktop.
Concurrent prime sieve translated from Go (http://play.golang.org/p/9U22NfrXeq)
-- Compile with `ghc -threaded -with-rtsopts=-N concurrent_sieve.hs`
import Control.Concurrent
import Control.Monad
import System.Environment
generate :: MVar Int -> IO ()
generate mOut = mapM_ (putMVar mOut) [2..]
primeFilter :: MVar Int -> MVar Int -> Int -> IO ()
primeFilter mIn mOut prime = forever $
takeMVar mIn >>= \i -> when (i `mod` prime /= 0) (putMVar mOut i)
main = do numArg:_ <- getArgs
m1 <- newEmptyMVar
forkIO $ generate m1
ms <- replicateM (read numArg) newEmptyMVar
foldM_ linkFilter m1 ms
linkFilter :: MVar Int -> MVar Int -> IO (MVar Int)
linkFilter mIn mOut = do prime <- takeMVar mIn
putStrLn $ show prime
forkIO $ primeFilter mIn mOut prime
return mOut
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment