1package match 2 3// todo common table of rune's length 4 5import ( 6 "fmt" 7 "strings" 8) 9 10const lenOne = 1 11const lenZero = 0 12const lenNo = -1 13 14type Matcher interface { 15 Match(string) bool 16 Index(string) (int, []int) 17 Len() int 18 String() string 19} 20 21type Matchers []Matcher 22 23func (m Matchers) String() string { 24 var s []string 25 for _, matcher := range m { 26 s = append(s, fmt.Sprint(matcher)) 27 } 28 29 return fmt.Sprintf("%s", strings.Join(s, ",")) 30} 31 32// appendMerge merges and sorts given already SORTED and UNIQUE segments. 33func appendMerge(target, sub []int) []int { 34 lt, ls := len(target), len(sub) 35 out := make([]int, 0, lt+ls) 36 37 for x, y := 0, 0; x < lt || y < ls; { 38 if x >= lt { 39 out = append(out, sub[y:]...) 40 break 41 } 42 43 if y >= ls { 44 out = append(out, target[x:]...) 45 break 46 } 47 48 xValue := target[x] 49 yValue := sub[y] 50 51 switch { 52 53 case xValue == yValue: 54 out = append(out, xValue) 55 x++ 56 y++ 57 58 case xValue < yValue: 59 out = append(out, xValue) 60 x++ 61 62 case yValue < xValue: 63 out = append(out, yValue) 64 y++ 65 66 } 67 } 68 69 target = append(target[:0], out...) 70 71 return target 72} 73 74func reverseSegments(input []int) { 75 l := len(input) 76 m := l / 2 77 78 for i := 0; i < m; i++ { 79 input[i], input[l-i-1] = input[l-i-1], input[i] 80 } 81} 82