У меня есть сложная структура данных, состоящая из классов, карт и множеств классов. Я хотел бы знать, есть ли общий механизм, чтобы вычислить «diff» между двумя структурами.Общий diff для сложной иерархической структуры данных
В качестве простого примера:
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. Это похоже на то, что я ищу. Но я этого не понимаю.
@ Библиотека stacycurl звучит точно так же, как вы ищете ... не стесняйтесь приходить и обсуждать ее на [бесформенном канале gitter] (https://gitter.im/milessabin/shapeless). –