template inline const list treeDelAssoc()

in kernel/tree.hpp [42:78]


template<typename T> inline const list<T> treeDelAssoc(const list<T>& k, const list<T>& l) noexcept {
    if (isNull(k) || isNull(l))
        return l;
    const list<T> lv = l;

    // If list is an assoc and matches, skip it
    if (isAssoc(lv)) {
        if (car<T>(lv) == car(k) && isNull(cdr(k)))
            return list<T>();
    }

    // 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, treeDelAssoc<T>(k, cdr(lv)));
        const list<T> da = treeDelAssoc<T>(k, a);
        return isNull(da)? treeDelAssoc<T>(k, cdr(lv)) : cons<T>(da, treeDelAssoc<T>(k, cdr(lv)));
    }

    // If we found a match, skip it and lookup children and rest of the list
    if (car<T>(a) == car(k)) {
        if (isNull(cdr(k)))
            return treeDelAssoc<T>(k, cdr(lv));
        return cons<T>(cons<T>(car<T>(a), treeDelAssoc<T>(cdr(k), cdr<T>(a))), treeDelAssoc<T>(k, cdr(lv)));
    }

    // No match, lookup children and rest of the list
    if (isNull(cdr<T>(a)))
        return cons<T>(a, treeDelAssoc<T>(k, cdr(lv)));
    if (!isList(cadr<T>(a)))
        return cons<T>(cons<T>(car<T>(a), cons<T>(cadr<T>(a), treeDelAssoc<T>(k, cddr<T>(a)))), treeDelAssoc<T>(k, cdr(lv)));
    const list<T> da = treeDelAssoc<T>(k, cadr<T>(a));
    if (isNull(da))
        return cons<T>(cons<T>(car<T>(a), treeDelAssoc<T>(k, cddr<T>(a))), treeDelAssoc<T>(k, cdr(lv)));
    return cons<T>(cons<T>(car<T>(a), cons<T>(da, treeDelAssoc<T>(k, cddr<T>(a)))), treeDelAssoc<T>(k, cdr(lv)));
}