slice.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package ctn
  2. func MapEach[A any, B any] (sa ([] A), f func(A)(B)) ([] B) {
  3. var sb = make([] B, len(sa))
  4. for i := range sa {
  5. sb[i] = f(sa[i])
  6. }
  7. return sb
  8. }
  9. func MapEachDeflate[A any, B any] (sa ([] A), f func(A)(B,bool)) ([] B) {
  10. var sb = make([] B, 0)
  11. for _, a := range sa {
  12. if b, ok := f(a); ok {
  13. sb = append(sb, b)
  14. }
  15. }
  16. return sb
  17. }
  18. func Filter[T any] (s ([] T), p func(T)(bool)) ([] T) {
  19. var result = make([] T, 0)
  20. for _, t := range s {
  21. if p(t) {
  22. result = append(result, t)
  23. }
  24. }
  25. return result
  26. }
  27. func RemoveFrom[T comparable] (s ([] T), target T) ([] T) {
  28. var result = make([] T, 0)
  29. for _, t := range s {
  30. if t != target {
  31. result = append(result, t)
  32. }
  33. }
  34. return result
  35. }
  36. func Reduce[A any, B any] (sa ([] A), b0 B, f func(b B, a A)(B)) B {
  37. var b = b0
  38. for _, a := range sa {
  39. b = f(b, a)
  40. }
  41. return b
  42. }
  43. func Reverse[T any] (s ([] T)) ([] T) {
  44. var L = len(s)
  45. var result = make([] T, L)
  46. for i := range s {
  47. result[((L-1)-i)] = s[i]
  48. }
  49. return result
  50. }
  51. func StableSorted[T any] (s ([] T), lt Less[T]) ([] T, error) {
  52. if len(s) == 0 {
  53. return nil, nil
  54. } else if len(s) == 1 {
  55. return [] T { s[0] }, nil
  56. } else {
  57. var middle = (len(s) / 2)
  58. var u, _ = StableSorted(s[:middle], lt)
  59. var v, _ = StableSorted(s[middle:], lt)
  60. return mergeSorted(u, v, lt), nil
  61. }
  62. }
  63. func mergeSorted[T any] (s1 ([] T), s2 ([] T), lt Less[T]) ([] T) {
  64. var p1 = 0
  65. var p2 = 0
  66. var l1 = len(s1)
  67. var l2 = len(s2)
  68. var r = make([] T, (l1 + l2))
  69. var q = 0
  70. for {
  71. if p1 < l1 && p2 < l2 {
  72. var v1 = s1[p1]
  73. var v2 = s2[p2]
  74. if !(lt(v2, v1)) {
  75. r[q] = v1; p1++; q++
  76. } else {
  77. r[q] = v2; p2++; q++
  78. }
  79. } else if p1 < l1 {
  80. var v1 = s1[p1]
  81. r[q] = v1; p1++; q++
  82. } else if p2 < l2 {
  83. var v2 = s2[p2]
  84. r[q] = v2; p2++; q++
  85. } else {
  86. return r
  87. }
  88. }
  89. }