package events // Matcher matches events. type Matcher interface { Match(event Event) bool } // MatcherFunc implements matcher with just a function. type MatcherFunc func(event Event) bool // Match calls the wrapped function. func (fn MatcherFunc) Match(event Event) bool { return fn(event) } // Filter provides an event sink that sends only events that are accepted by a // Matcher. No methods on filter are goroutine safe. type Filter struct { dst Sink matcher Matcher closed bool } // NewFilter returns a new filter that will send to events to dst that return // true for Matcher. func NewFilter(dst Sink, matcher Matcher) Sink { return &Filter{dst: dst, matcher: matcher} } // Write an event to the filter. func (f *Filter) Write(event Event) error { if f.closed { return ErrSinkClosed } if f.matcher.Match(event) { return f.dst.Write(event) } return nil } // Close the filter and allow no more events to pass through. func (f *Filter) Close() error { // TODO(stevvooe): Not all sinks should have Close. if f.closed { return nil } f.closed = true return f.dst.Close() }