我有一个由“状态机”(“流程图”)定义的分布式系统。
每个系统将其状态写入共享“日志”。
我将每个状态表示为密封特质的一部分以及该状态的给定“状态”。
我希望“合并/减少”到单个状态,以表示当前进度。
(有一些放宽措施,因为不是所有人都必须成功才能最终成功完成状态)
有两个密封特质代表流程:
现在有一组规则,我用它们来定义单个状态的降级。基本上,它给出了优先级顺序:A < B < C,... < Z,并且Pending < InProgress < Success < Fail。所以如果存在以下状态:
(A, Success)与(C, Pending)
我想将其降级为(C, Pending)。而如果:
(A, Success)与(B, Fail)
我想将其降级为(B, Fail)。在我的情况下,我可以将其建模为一个简单的整数比较(可能带有我明确测试的异常值)。我不清楚如何使密封特征可比/可排序,这会让我的生活变得更加轻松。类似于以下内容即可:
每个系统将其状态写入共享“日志”。
我将每个状态表示为密封特质的一部分以及该状态的给定“状态”。
我希望“合并/减少”到单个状态,以表示当前进度。
(有一些放宽措施,因为不是所有人都必须成功才能最终成功完成状态)
有两个密封特质代表流程:
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
}