Я уже некоторое время думал о том, как я собираюсь внедрить двусвязное дерево или список в Scala, используя только классы неизменяемых случаев. Для большинства операций "обновления" я использую метод копирования и обновления. Например, при установке дочерних элементов родителя я говорю
parent = parent.copy(child=child)
или при установке родителя дочернего элемента, я говорю
child = child.copy(parent=parent)
Я понимаю, что если я установил родительский элемент, чтобы он содержал дочерний элемент, а затем создайте и обновите новый дочерний элемент, чтобы содержать родителя, родитель будет содержать ссылку на старый дочерний элемент. Аналогично, если бы я попытался сделать это наоборот, то ребенок будет содержать ссылку на старого родителя.
Я хочу, чтобы мое дерево было дважды привязано, чтобы я мог ползать в обоих направлениях: от корня до своих детей или вверх от листа к своим родителям. Возможно ли "одновременно" связать родительский и дочерний узлы таким образом, чтобы дать мне круговую ссылку, которую я затем сканирую в двух направлениях?
Я мог бы легко сделать это с помощью изменяемых данных, но в моем случае дважды связанное дерево будет существовать в течение длительного времени после создания, и я хочу сохранить его неизменным, если это вообще возможно.