50 lines
		
	
	
		
			673 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			673 B
		
	
	
	
		
			Go
		
	
	
	
	
	
package match
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"unicode/utf8"
 | 
						|
)
 | 
						|
 | 
						|
type Max struct {
 | 
						|
	Limit int
 | 
						|
}
 | 
						|
 | 
						|
func NewMax(l int) Max {
 | 
						|
	return Max{l}
 | 
						|
}
 | 
						|
 | 
						|
func (self Max) Match(s string) bool {
 | 
						|
	var l int
 | 
						|
	for range s {
 | 
						|
		l += 1
 | 
						|
		if l > self.Limit {
 | 
						|
			return false
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return true
 | 
						|
}
 | 
						|
 | 
						|
func (self Max) Index(s string) (int, []int) {
 | 
						|
	segments := acquireSegments(self.Limit + 1)
 | 
						|
	segments = append(segments, 0)
 | 
						|
	var count int
 | 
						|
	for i, r := range s {
 | 
						|
		count++
 | 
						|
		if count > self.Limit {
 | 
						|
			break
 | 
						|
		}
 | 
						|
		segments = append(segments, i+utf8.RuneLen(r))
 | 
						|
	}
 | 
						|
 | 
						|
	return 0, segments
 | 
						|
}
 | 
						|
 | 
						|
func (self Max) Len() int {
 | 
						|
	return lenNo
 | 
						|
}
 | 
						|
 | 
						|
func (self Max) String() string {
 | 
						|
	return fmt.Sprintf("<max:%d>", self.Limit)
 | 
						|
}
 |