5
5
6
6
module Main where
7
7
8
- import Control.Distributed.Process
8
+ import Control.Distributed.Process hiding ( call )
9
9
import Control.Distributed.Process.Node
10
10
import Control.Distributed.Process.Extras
11
11
( ExitReason (.. )
@@ -15,6 +15,7 @@ import qualified Control.Distributed.Process.Extras (__remoteTable)
15
15
import Control.Distributed.Process.Extras.Time hiding (timeout )
16
16
import Control.Distributed.Process.Extras.Timer
17
17
import Control.Distributed.Process.FSM
18
+ import Control.Distributed.Process.FSM.Client (call )
18
19
import Control.Distributed.Process.FSM.Internal.Process
19
20
import Control.Distributed.Process.FSM.Internal.Types hiding (State , liftIO )
20
21
import qualified Control.Distributed.Process.FSM.Internal.Types as FSM
@@ -79,42 +80,49 @@ switchFsm = startState
79
80
.| (event :: Event Reset )
80
81
~> (allState $ \ Reset -> put initCount >> enter Off )
81
82
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
85
103
86
104
(sp, rp) <- newChan :: Process (SendPort Message , ReceivePort Message )
87
105
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
92
108
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
97
111
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 )
102
114
103
115
send pid ExitShutdown
104
116
sleep $ seconds 6
105
117
alive <- isProcessAlive pid
106
118
liftIO $ putStrLn $ " alive == " ++ (show alive)
107
119
alive `shouldBe` equalTo True
108
120
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 )
113
123
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
118
126
119
127
send pid ExitNormal
120
128
sleep $ seconds 5
@@ -133,8 +141,10 @@ tests transport = do
133
141
return [
134
142
testGroup " Language/DSL"
135
143
[
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)
138
148
]
139
149
]
140
150
0 commit comments