transient 0.1.0.1 → 0.1.0.2
raw patch · 4 files changed
+66/−69 lines, 4 filesdep ~base
Dependency ranges changed: base
Files
- Main.hs +9/−7
- move.hs +48/−55
- src/Transient/Move.hs +8/−6
- transient.cabal +1/−1
Main.hs view
@@ -319,29 +319,31 @@ pubSub= do option "pubs" "an example of publish-subscribe using Event Vars (EVars)" - v <- newEVar :: TransIO (EVar String) + v <- newEVar :: TransIO (EVar String) v' <- newEVar - suscribe v v' <|> publish v v' + subscribe v v' <|> publish v v' + liftIO $ putStrLn ".............." where publish v v'= do liftIO $ putStrLn "Enter a message to publish" - msg <- input(const True) + msg <- input(const True) writeEVar v msg liftIO $ putStrLn "after writing first EVar\n" writeEVar v' $ "second " ++ msg liftIO $ putStrLn "after writing second EVar\n" publish v v' - suscribe :: EVar String -> EVar String -> TransIO () - suscribe v v'= do + + subscribe :: EVar String -> EVar String -> TransIO () + subscribe v v'= do r <- (,) <$> proc1 v <*> proc2 v' liftIO $ do putStr "applicative result= " print r - suscribe2 :: EVar String -> EVar String -> TransIO () - suscribe2 v v'= do + susbcribe2 :: EVar String -> EVar String -> TransIO () + susbcribe2 v v'= do x <- readEVar v y <- readEVar v' liftIO $ do
move.hs view
@@ -19,41 +19,41 @@ import Data.Typeable import Control.Concurrent.STM import Data.IORef - - -main= do - let port1 = PortNumber 2000 - port2 = PortNumber 2001 - - - keep $ do - conn port1 port1 <|> conn port2 port1 - - examples' host port2 - where - host= "localhost" --- delay = liftIO $ threadDelay 1000000 - conn p p'= connect host p host p' - - - - - -test = do - args <- getArgs - let ports= [("localhost",PortNumber 2000), ("localhost",PortNumber 2001)] - - let [(_,port1), (_,port2)]= if null args then ports else reverse ports - print [port1, port2] - let local= "localhost" - beamInit port1 $ do - logged $ option "call" "call" - callTo local port2 (liftIO $ print "HOLA") - <|> callTo local port2(liftIO $ print "HELLO") +-- some tests for distributed computing +--main= do +-- let port1 = PortNumber 2000 +-- port2 = PortNumber 2001 +-- +-- +-- keep $ do +-- conn port1 port1 <|> conn port2 port1 +-- +-- examples' host port2 +-- where +-- host= "localhost" +---- delay = liftIO $ threadDelay 1000000 +-- conn p p'= connect host p host p' +-- +-- +-- +-- +-- +--test = do +-- args <- getArgs +-- let ports= [("localhost",PortNumber 2000), ("localhost",PortNumber 2001)] +-- +-- let [(_,port1), (_,port2)]= if null args then ports else reverse ports +-- print [port1, port2] +-- let local= "localhost" +-- beamInit port1 $ do +-- logged $ option "call" "call" +-- callTo local port2 (liftIO $ print "HOLA") +-- <|> callTo local port2(liftIO $ print "HELLO") -two = do +-- to be executed with two or more nodes +main = do args <- getArgs if length args < 2 then do @@ -71,35 +71,27 @@ examples -examples = do - nodes <- logged getNodes - logged $ liftIO $ print $ "NODES=" ++ show nodes - let (remoteHost,remotePort)= head $ tail nodes - examples' remoteHost remotePort - -examples' remoteHost remotePort= do +examples = do logged $ option "main" "to see the menu" <|> return "" r <-logged $ option "move" "move to another node" <|> option "call" "call a function in another node" <|> option "chat" "chat" <|> option "netev" "events propagating trough the network" case r of - "call" -> callExample remoteHost remotePort - "move" -> moveExample remoteHost remotePort + "call" -> callExample + "move" -> moveExample "chat" -> chat - "netev" -> networkEvents remoteHost remotePort + "netev" -> networkEvents data Environ= Environ (IORef String) deriving Typeable -callExample host port= do +callExample = do + nodes <- logged getNodes + let Node host port _= head $ tail nodes + logged $ putStrLnhp port "asking for the remote data" s <- callTo host port $ do putStrLnhp port "remote callTo request" - Environ environ <- getSData <|> do - ref <- liftIO $ newIORef "Not Changed" - let env= Environ ref - setSData env - return env liftIO $ readIORef environ @@ -108,18 +100,17 @@ environ= unsafePerformIO $ newIORef "Not Changed" -moveExample host port= do +moveExample = do + nodes <- logged getNodes + let Node host port _= head $ tail nodes + putStrLnhp port "enter a string. It will be inserted in the other node by a migrating program" name <- logged $ input (const True) beamTo host port putStrLnhp port "moved!" putStrLnhp port $ "inserting "++ name ++" as new data in this node" - Environ environ <- getSData <|> do - ref <- liftIO $ newIORef "Not Changed" - let env= Environ ref - setSData env - return env + liftIO $ writeIORef environ name return() @@ -132,7 +123,9 @@ clustered $ liftIO $ putStrLn line -networkEvents rh rp= do +networkEvents = do + nodes <- logged getNodes + let Node rh rp _= head $ tail nodes logged $ do putStrLnhp rp "callTo is not a simole remote call. it stablish a connection" putStrLnhp rp "between transient processes in different nodes"
src/Transient/Move.hs view
@@ -33,7 +33,7 @@ import Data.Monoid import qualified Data.Map as M import Data.List (nub,(\\)) - +import Data.IORef -- | install in a remote node a haskell package with an executable transient service initialized with `listen` @@ -173,10 +173,10 @@ deriving instance Ord PortID -myNode= unsafePerformIO $ atomically $ newTVar Nothing +myNode= unsafePerformIO $ newIORef Nothing -setMyNode h p= liftIO $ atomically $ writeTVar myNode $ Just (h,p) -getMyNode= Transient $ liftIO $ atomically $ readTVar myNode +setMyNode h p= liftIO $ writeIORef myNode $ Just (h,p) +getMyNode= Transient $ liftIO $ readIORef myNode getNodes :: TransIO [Node] getNodes = Transient $ Just <$> (liftIO $ atomically $ readTVar nodeList) @@ -223,9 +223,11 @@ port <- logged $ return port nodes <- callTo remotehost remoteport $ do clustered $ addNodes [newnode] - getNodes + r <- getNodes + liftIO $ putStrLn $ "Connected to modes: " ++ show r + return r logged $ addNodes nodes - logged $ liftIO $ putStrLn $ "Connected to modes: " ++ show nodes +
transient.cabal view
@@ -2,7 +2,7 @@ synopsis: A monad for extensible effects and primitives for unrestricted composability of applications homepage: http://www.fpcomplete.com/user/agocorona bug-reports: https://github.com/agocorona/transient/issues -version: 0.1.0.1 +version: 0.1.0.2 cabal-version: >=1.10 build-type: Simple license: GPL-3