func.go

 1package document
 2
 3func Filter(d DocumentContent, f func(Node) bool) []Node {
 4	return filter(d.Main, f)
 5}
 6
 7func filter(nodes []Node, f func(Node) bool) []Node {
 8	out := make([]Node, 0)
 9	for _, node := range nodes {
10		if f(node) {
11			out = append(out, node)
12		}
13		if node.Children != nil {
14			out = append(out, filter(node.Children, f)...)
15		}
16	}
17	return out
18}
19
20func FlatMap[T any](d DocumentContent, f func(Node) T) []T {
21	return flatMap(d.Main, f)
22}
23
24func flatMap[T any](nodes []Node, f func(Node) T) []T {
25	out := make([]T, 0)
26	for _, node := range nodes {
27		out = append(out, f(node))
28		if node.Children != nil {
29			out = append(out, flatMap(node.Children, f)...)
30		}
31	}
32	return out
33}