我有一个状态机,我想使用 scalaz-stream Process1 对其进行建模。
状态机对客户端和服务器之间的消息流进行建模。
一组基本的数据类型可能是:
sealed trait ServerState
case object Disconnected extends ServerState
case object Authenticating extends ServerState
case object Idle extends ServerState
case object Busy extends ServerState
sealed trait Message
case object Query extends Message
case object StartupMessage extends Message
case object AuthenticationOk extends Message
case object QueryResponse extends Message
在我的脑海中,这将由 a Process1[I, O]
、 wheretype I = Message
和type O = scalaz.State[Message, ServerState]
.
这就像一团迷雾——我可以看到解决方案的轮廓,但它的坚定定义却让我无法理解。
目前我有一些看起来像这样的东西
type Transition = scalaz.State[Message, ServerState]
val connecting = Transition { StartupMessage => (StartupMessage, Authenticating) }
def fsm(state: Transition): Process1[Message, Transition] = {
Await [Message, Transition] { msg =>
case (connecting, AuthenticationOk) => Emit1(connecting)
}
}
我知道这是错误的,但我不知道状态转换需要在哪里生活。
当驱动程序处理内部状态时,进程是否应该接受Message
并返回物理?ServerState
Process1
我正在努力了解如何“携带”目前无法执行的消息。
例子:
1. Current ServerState = Disconnected
2. StateMachine gets Query Message
3. StateMachine must send StartupMessage, ServerState now equals = Authenticating
4. StateMachine receives AuthenticationOk, ServerState now equals Idle
5. StateMachine must now sends original query message, ServerState now equals Busy
6. StateMachine gets QueryResponse, ServerState now equals Idle