in kernel/tree.hpp [85:116]
template<typename T> inline const list<T> treeSubstAssoc(const list<T>& k, const list<T>& n, const list<T>& lv) noexcept {
if (isNull(k) || isNull(lv))
return lv;
// If list is an assoc and matches, substitute it
if (isAssoc(lv)) {
if (car<T>(lv) == car(k) && isNull(cdr(k)))
return n;
}
// If list element is not an assoc, lookup children and rest of the list
const T a = car(lv);
if (!isAssoc(a)) {
if (!isList(a))
return cons<T>(a, treeSubstAssoc<T>(k, n, cdr(lv)));
return cons<T>(treeSubstAssoc<T>(k, n, a), treeSubstAssoc<T>(k, n, cdr(lv)));
}
// If we found a match, substitute it and lookup children and rest of the list
if (car<T>(a) == car(k)) {
if (isNull(cdr(k)))
return cons<T>(n, treeSubstAssoc<T>(k, n, cdr(lv)));
return cons<T>(cons<T>(car<T>(a), treeSubstAssoc<T>(cdr(k), n, cdr<T>(a))), treeSubstAssoc<T>(k, n, cdr(lv)));
}
// No match, lookup children and rest of the list
if (isNull(cdr<T>(a)))
return cons<T>(a, treeSubstAssoc<T>(k, n, cdr(lv)));
if (!isList(cadr<T>(a)))
return cons<T>(cons<T>(car<T>(a), cons<T>(cadr<T>(a), treeSubstAssoc<T>(k, n, cddr<T>(a)))), treeSubstAssoc<T>(k, n, cdr(lv)));
return cons<T>(cons<T>(car<T>(a), cons<T>(treeSubstAssoc<T>(k, n, cadr<T>(a)), treeSubstAssoc<T>(k, n, cddr<T>(a)))), treeSubstAssoc<T>(k, n, cdr(lv)));
}