nustack
Catalogue

Meta

Tree-level meta-programming tools. Walk, query, and rewrite Nu trees. Core only — shapes and ext/ not included.

Walk

NameModuleSignatureMeaning
preordernu.tree.walkpreorder(root)depth-first pre-order iteration
postordernu.tree.walkpostorder(root)depth-first post-order iteration
bfsnu.tree.walkbfs(root)breadth-first iteration
leavesnu.tree.walkleaves(root)yield leaf nodes only
ancestorsnu.tree.walkancestors(target, root)path from root to a target node (exclusive)

Query

NameModuleSignatureMeaning
findnu.tree.queryfind(root, pred)all nodes matching predicate
find_firstnu.tree.queryfind_first(root, pred)first node matching predicate, or None
countnu.tree.querycount(root, pred=None)count matching nodes (None = all)
sizenu.tree.querysize(root)total node count
depthnu.tree.querydepth(root)maximum tree depth (leaf = 0)

Rewrite

NameModuleSignatureMeaning
composenu.tree.rewritecompose(*transforms)chain transforms left-to-right
applynu.tree.rewriteapply(root, *transforms)run a sequence of transforms on root
map_childrennu.tree.rewritemap_children(node, fn)transform direct children only
map_nodesnu.tree.rewritemap_nodes(root, fn, order=...)transform every node, top-down or bottom-up
replacenu.tree.rewritereplace(root, pred, replacement)swap nodes matching predicate
wrapnu.tree.rewritewrap(root, pred, wrapper)wrap nodes matching predicate
unwrapnu.tree.rewriteunwrap(root, pred)splice out single-child wrappers
graftnu.tree.rewritegraft(root, target, subtree)replace one specific node (by identity) with a subtree
prunenu.tree.rewriteprune(root, pred)drop subtrees matching predicate
conditional_wrapnu.tree.rewriteconditional_wrap(root, pred, wrapper)wrap biggest matching subtree at each level, no recursion inside

On this page