| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 | package strmatcherimport "regexp"type Matcher interface {	Match(string) bool}type Type byteconst (	Full Type = iota	Substr	Domain	Regex)func (t Type) New(pattern string) (Matcher, error) {	switch t {	case Full:		return fullMatcher(pattern), nil	case Substr:		return substrMatcher(pattern), nil	case Domain:		return domainMatcher(pattern), nil	case Regex:		r, err := regexp.Compile(pattern)		if err != nil {			return nil, err		}		return ®exMatcher{			pattern: r,		}, nil	default:		panic("Unknown type")	}}type matcherEntry struct {	m  Matcher	id uint32}type MatcherGroup struct {	count         uint32	fullMatchers  map[string]uint32	otherMatchers []matcherEntry}func NewMatcherGroup() *MatcherGroup {	return &MatcherGroup{		count:        1,		fullMatchers: make(map[string]uint32),	}}func (g *MatcherGroup) Add(m Matcher) uint32 {	c := g.count	g.count++	if fm, ok := m.(fullMatcher); ok {		g.fullMatchers[string(fm)] = c	} else {		g.otherMatchers = append(g.otherMatchers, matcherEntry{			m:  m,			id: c,		})	}	return c}func (g *MatcherGroup) Match(pattern string) uint32 {	if c, f := g.fullMatchers[pattern]; f {		return c	}	for _, e := range g.otherMatchers {		if e.m.Match(pattern) {			return e.id		}	}	return 0}func (g *MatcherGroup) Size() uint32 {	return g.count}
 |