@@ -0,0 +1,52 @@
1+import System.Environment (getArgs)
2+import Network.Transport
3+import Network.Transport.TCP (createTransport)
4+import qualified Data.ByteString.Char8 as BSC (putStrLn, pack, unpack)
5+import qualified Data.ByteString as BS (concat)
6+import Control.Concurrent (forkIO)
7+import Control.Concurrent.MVar (MVar, newEmptyMVar, putMVar, takeMVar)
8+import System.IO (hFlush, stdout, stderr, hPutStrLn)
10+mkList :: Int -> [Int]
11+mkList n = [1 .. n - 1]
13+relPrime :: Int -> Int -> Bool
14+relPrime x y = gcd x y == 1
17+euler n = length (filter (relPrime n) (mkList n))
19+sumEuler :: Int -> Int
20+sumEuler = sum . (map euler) . mkList
22+worker :: String -> MVar () -> EndPoint -> IO ()
23+worker id done endpoint = do
24+ ConnectionOpened _ _ theirAddr <- receive endpoint
25+ Right replyChan <- connect endpoint theirAddr ReliableOrdered
29+ event <- receive endpoint
31+ ConnectionClosed _ -> do
36+ i = read . BSC.unpack . BS.concat $ msg
37+ send replyChan [BSC.pack . show $ sumEuler i]
42+ (id:host:port:_) <- getArgs
43+ Right transport <- createTransport host port
44+ Right endpoint <- newEndPoint transport
45+ workerDone <- newEmptyMVar
47+ BSC.putStrLn (endPointAddressToByteString (address endpoint))
50+ forkIO $ worker id workerDone endpoint