refactor: move filter logic to FilterFunc

so it becomes accessible w/o having to construct a Filter renderer.
This commit is contained in:
Matthias Radestock
2017-11-19 10:17:54 +00:00
parent 88e8b52d66
commit e643ec56be

View File

@@ -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