utils.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package main
  2. import (
  3. "unicode"
  4. )
  5. type mapStringSet map[string]stringSet
  6. type intRange struct {
  7. min int
  8. max int
  9. }
  10. func makeIntRange(min, max int) intRange {
  11. return intRange{
  12. min,
  13. max,
  14. }
  15. }
  16. func (r intRange) get(n int) bool {
  17. return n >= r.min && n <= r.max
  18. }
  19. type intRanges []intRange
  20. func (rs intRanges) get(n int) bool {
  21. for _, r := range rs {
  22. if r.get(n) {
  23. return true
  24. }
  25. }
  26. return false
  27. }
  28. func min(a, b int) int {
  29. if a < b {
  30. return a
  31. }
  32. return b
  33. }
  34. func max(a, b int) int {
  35. if a < b {
  36. return b
  37. }
  38. return a
  39. }
  40. func (mss mapStringSet) Add(n string, v string) {
  41. _, ok := mss[n]
  42. if !ok {
  43. mss[n] = make(stringSet)
  44. }
  45. mss[n].set(v)
  46. }
  47. func lessRunes(iRunes, jRunes []rune) bool {
  48. max := len(iRunes)
  49. if max > len(jRunes) {
  50. max = len(jRunes)
  51. }
  52. for idx := 0; idx < max; idx++ {
  53. ir := iRunes[idx]
  54. jr := jRunes[idx]
  55. lir := unicode.ToLower(ir)
  56. ljr := unicode.ToLower(jr)
  57. if lir != ljr {
  58. return lir < ljr
  59. }
  60. // the lowercase runes are the same, so compare the original
  61. if ir != jr {
  62. return ir < jr
  63. }
  64. }
  65. return len(iRunes) < len(jRunes)
  66. }
  67. func stringSliceEqual(a, b []string) bool {
  68. if a == nil && b == nil {
  69. return true
  70. }
  71. if a == nil || b == nil {
  72. return false
  73. }
  74. if len(a) != len(b) {
  75. return false
  76. }
  77. for i := 0; i < len(a); i++ {
  78. if a[i] != b[i] {
  79. return false
  80. }
  81. }
  82. return true
  83. }