用于复杂分层数据结构的通用差异

时间:2015-12-14 09:35:58

标签: scala scala-collections shapeless

我有一个由案例类,地图和集合组成的复杂数据结构。我想知道是否有一个泛型机制来计算两个结构之间的“差异”。

举个简单的例子:

val s0 = Set(1,2,3)
val s1 = Set(2,3,4)
val diff = diff(s0, s1)
// this should contain the information that 1 has been removed and 4 has
// been added
assert(s1 == diff.patch(s0))

一个更复杂的例子:

case class User(name: String, roles: Set[String])
val user0 = User("Hans", Set("Developer", "Admin")
val user1 = User("Hans", Set("Admin", "Manager")
val diff = diff(user0, user1)
// this should contain the information that "Developer" has been removed
// and "Manager" has been added to the roles field

请注意,我对一个适用于任意案例类和深层次结构的泛型解决方案感兴趣。我有一种感觉,这应该可以使用基于类型的方法和无形或一些样板。允许为新集合类型指定“diff算法”的方法的加分点。

我找到了https://github.com/stacycurl/delta。这似乎与我正在寻找的非常接近。但我真的不明白。

1 个答案:

答案 0 :(得分:2)

有一个基于宏的库s_mach.datadiff。我没有使用它,但头版示例是从任意案例类生成差异。