template inline const list treeSelectAssoc()

in kernel/tree.hpp [123:154]


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

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

    // 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 treeSelectAssoc<T>(k, cdr(lv));
        return append<T>(treeSelectAssoc<T>(k, a), treeSelectAssoc<T>(k, cdr(lv)));
    }

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

    // No match, lookup children and rest of the list
    if (isNull(cdr<T>(a)))
        return treeSelectAssoc<T>(k, cdr(lv));
    if (!isList(cadr<T>(a)))
        return append<T>(treeSelectAssoc<T>(k, cddr<T>(a)), treeSelectAssoc<T>(k, cdr(lv)));
    return append<T>(append<T>(treeSelectAssoc<T>(k, cadr<T>(a)), treeSelectAssoc<T>(k, cddr<T>(a))), treeSelectAssoc<T>(k, cdr(lv)));
}