2015-12-14 3 views
3

У меня есть сложная структура данных, состоящая из классов, карт и множеств классов. Я хотел бы знать, есть ли общий механизм, чтобы вычислить «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. Это похоже на то, что я ищу. Но я этого не понимаю.

+0

@ Библиотека stacycurl звучит точно так же, как вы ищете ... не стесняйтесь приходить и обсуждать ее на [бесформенном канале gitter] (https://gitter.im/milessabin/shapeless). –

ответ

2

Существует библиотека на основе макросов s_mach.datadiff. Я не использовал его, но пример на первой странице генерирует diff из произвольного класса case.

+0

Это выглядит интересно. Я это проверю. Тем не менее, кажется, что вам необходимо определить объекты патчей для каждого класса case вручную. –

Смежные вопросы