diff --git a/render/filters.go b/render/filters.go index e5bdf6278..1b920be35 100644 --- a/render/filters.go +++ b/render/filters.go @@ -82,41 +82,13 @@ func ComposeFilterFuncs(fs ...FilterFunc) FilterFunc { } } -// Filter removes nodes from a view based on a predicate. -type Filter struct { - Renderer - FilterFunc FilterFunc -} - -// MakeFilter makes a new Filter (that ignores pseudo nodes). -func MakeFilter(f FilterFunc, r Renderer) Renderer { - return Filter{ - Renderer: r, - FilterFunc: func(n report.Node) bool { - return n.Topology == Pseudo || f(n) - }, - } -} - -// MakeFilterPseudo makes a new Filter that will not ignore pseudo nodes. -func MakeFilterPseudo(f FilterFunc, r Renderer) Renderer { - return Filter{ - Renderer: r, - FilterFunc: f, - } -} - -// Render implements Renderer -func (f Filter) Render(rpt report.Report) Nodes { - return f.render(rpt) -} - -func (f Filter) render(rpt report.Report) Nodes { +// Apply applies the filter to all nodes +func (f FilterFunc) Apply(nodes Nodes) Nodes { output := report.Nodes{} inDegrees := map[string]int{} filtered := 0 - for id, node := range f.Renderer.Render(rpt).Nodes { - if f.FilterFunc(node) { + for id, node := range nodes.Nodes { + if f(node) { output[id] = node inDegrees[id] = 0 } else { @@ -152,6 +124,35 @@ func (f Filter) render(rpt report.Report) Nodes { return Nodes{Nodes: output, Filtered: filtered} } +// Filter removes nodes from a view based on a predicate. +type Filter struct { + Renderer + FilterFunc FilterFunc +} + +// MakeFilter makes a new Filter (that ignores pseudo nodes). +func MakeFilter(f FilterFunc, r Renderer) Renderer { + return Filter{ + Renderer: r, + FilterFunc: func(n report.Node) bool { + return n.Topology == Pseudo || f(n) + }, + } +} + +// MakeFilterPseudo makes a new Filter that will not ignore pseudo nodes. +func MakeFilterPseudo(f FilterFunc, r Renderer) Renderer { + return Filter{ + Renderer: r, + FilterFunc: f, + } +} + +// Render implements Renderer +func (f Filter) Render(rpt report.Report) Nodes { + return f.FilterFunc.Apply(f.Renderer.Render(rpt)) +} + // IsConnectedMark is the key added to Node.Metadata by // ColorConnected to indicate a node has an edge pointing to it or // from it