55
66module Main where
77
8- import Control.Distributed.Process
8+ import Control.Distributed.Process hiding ( call )
99import Control.Distributed.Process.Node
1010import Control.Distributed.Process.Extras
1111 ( ExitReason (.. )
@@ -15,6 +15,7 @@ import qualified Control.Distributed.Process.Extras (__remoteTable)
1515import Control.Distributed.Process.Extras.Time hiding (timeout )
1616import Control.Distributed.Process.Extras.Timer
1717import Control.Distributed.Process.FSM
18+ import Control.Distributed.Process.FSM.Client (call )
1819import Control.Distributed.Process.FSM.Internal.Process
1920import Control.Distributed.Process.FSM.Internal.Types hiding (State , liftIO )
2021import qualified Control.Distributed.Process.FSM.Internal.Types as FSM
@@ -79,42 +80,49 @@ switchFsm = startState
7980 .| (event :: Event Reset )
8081 ~> (allState $ \ Reset -> put initCount >> enter Off )
8182
82- walkingAnFsmTree :: Process ()
83- walkingAnFsmTree = do
84- pid <- start Off initCount switchFsm
83+ switchFsmAlt :: Step State StateData
84+ switchFsmAlt =
85+ begin startState $
86+ pick (await (event :: Event ButtonPush ) ((pick (atState On (set (+ 1 ) >> enter Off ))
87+ (atState Off (set (+ 1 ) >> enter On ))) `join` (reply currentState)))
88+ (pick (await (event :: Event Stop ) (pick (matching (== ExitShutdown ) (\ _ -> timeout (seconds 3 ) Reset ))
89+ (matching (const True ) stop)))
90+ (pick (await (event :: Event Check ) (reply stateData))
91+ (await (event :: Event Reset ) (always $ \ Reset -> put initCount >> enter Off ))))
92+
93+ notSoQuirkyDefinitions :: Process ()
94+ notSoQuirkyDefinitions = do
95+ start Off initCount switchFsmAlt >>= walkingAnFsmTree
96+
97+ quirkyOperators :: Process ()
98+ quirkyOperators = do
99+ start Off initCount switchFsm >>= walkingAnFsmTree
100+
101+ walkingAnFsmTree :: ProcessId -> Process ()
102+ walkingAnFsmTree pid = do
85103
86104 (sp, rp) <- newChan :: Process (SendPort Message , ReceivePort Message )
87105
88- send pid (wrapMessage (() :: ButtonPush ), sp)
89- msg <- receiveChan rp :: Process Message
90- mSt <- unwrapMessage msg :: Process (Maybe State )
91- mSt `shouldBe` equalTo (Just On )
106+ mSt <- call pid (() :: ButtonPush ) :: Process State
107+ mSt `shouldBe` equalTo On
92108
93- send pid (wrapMessage (() :: ButtonPush ), sp)
94- msg' <- receiveChan rp :: Process Message
95- mSt' <- unwrapMessage msg' :: Process (Maybe State )
96- mSt' `shouldBe` equalTo (Just Off )
109+ mSt' <- call pid (() :: ButtonPush ) :: Process State
110+ mSt' `shouldBe` equalTo Off
97111
98- send pid (wrapMessage Check , sp)
99- chk <- receiveChan rp :: Process Message
100- mCk <- unwrapMessage chk :: Process (Maybe StateData )
101- mCk `shouldBe` equalTo (Just $ (2 :: StateData ))
112+ mCk <- call pid Check :: Process StateData
113+ mCk `shouldBe` equalTo (2 :: StateData )
102114
103115 send pid ExitShutdown
104116 sleep $ seconds 6
105117 alive <- isProcessAlive pid
106118 liftIO $ putStrLn $ " alive == " ++ (show alive)
107119 alive `shouldBe` equalTo True
108120
109- send pid (wrapMessage Check , sp)
110- chk2 <- receiveChan rp :: Process Message
111- mCk2 <- unwrapMessage chk2 :: Process (Maybe StateData )
112- mCk2 `shouldBe` equalTo (Just $ (0 :: StateData ))
121+ mCk2 <- call pid Check :: Process StateData
122+ mCk2 `shouldBe` equalTo (0 :: StateData )
113123
114- send pid (wrapMessage (() :: ButtonPush ), sp)
115- rst' <- receiveChan rp :: Process Message
116- mrst' <- unwrapMessage rst' :: Process (Maybe State )
117- mrst' `shouldBe` equalTo (Just On )
124+ mrst' <- call pid (() :: ButtonPush ) :: Process State
125+ mrst' `shouldBe` equalTo On
118126
119127 send pid ExitNormal
120128 sleep $ seconds 5
@@ -133,8 +141,10 @@ tests transport = do
133141 return [
134142 testGroup " Language/DSL"
135143 [
136- testCase " Traversing an FSM definition"
137- (runProcess localNode walkingAnFsmTree)
144+ testCase " Traversing an FSM definition (operators)"
145+ (runProcess localNode quirkyOperators)
146+ , testCase " Traversing an FSM definition (functions)"
147+ (runProcess localNode notSoQuirkyDefinitions)
138148 ]
139149 ]
140150
0 commit comments