【发布时间】:2019-09-04 01:25:09
【问题描述】:
我有一个由某种“状态机”(“流程图”)定义的分布式系统
每个系统都在共享的“日志”中写入状态
我将每个状态表示为密封特征的一部分以及该状态的给定“状态”
我想“合并/减少”到代表当前进度的单个状态。
(有一些放宽,因为并非所有都必须成功才能成功完成最终状态)
有 2 个密封特征代表流程:
sealed trait System
case object A extends System
case object B extends System
case object C extends System
...
sealed trait Status
case object Pending extends Status
case object InProgress extends Status
case object Success extends Status
case object Fail extends Status
日志:
A, Success
B, Fail
C, Pending
...
...
现在有一组规则用于定义单个状态减少
基本上它优先考虑
A < B < C, ... < Z
和
Pending < InProgress < Success < Fail
所以如果有以下状态:
(A, Success) 与 (C, Pending)
我想减少到(C,Pending)
如果
(A,Success) 与 (B, Fail)
我想减少到(B, Fail)
在我的情况下,我可以将其建模为一个简单的整数比较(可能带有我明确测试的异常值)
我不清楚如何使密封的特征具有可比性/可排序性,这将使我的生活更轻松
以下几点就足够了:
def reduce(states: Seq[(System,Status)]) : (System,Status) = {
states.order... {left.system < right.system) && (a.status < b.status) ... possibly another ordering test ....}.tail // take the last one in the ordering
}
【问题讨论】:
标签: scala traits enumeration comparable partial-ordering