Мне нужно динамически изменять данные этой структуры:
[:db/id
:list/title
:list/type
{:list/items [... lots of nested data ...]}]
к следующему:
[:db/id
:list/title
:list/type
{(default :list/items []) [... lots of nested data ...]}]
Поскольку я обрабатываю несколько разных запросов, я могу быть уверен, что соединение будет четвертым элементом в векторе. Но мне нужно заменить каждый экземпляр :list/items
на (default :list/items [])
.
Единственный известный мне способ сделать это — использовать clojure.walk/prewalk
. Однако это приводит к бесконечной рекурсии:
(clojure.walk/prewalk #(if (= :list/items %)
'(default :list/items [])
%)
query)
Как только обход находит :list/items
и заменяет его на '(default :list/items [])
, он затем находит :list/items
в замененном значении и заменяет его. И так далее.
Я могу использовать атом, чтобы убедиться, что значение заменяется только один раз, но это похоже на мошенничество.
Любые другие подходы?