map.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package ctn
  2. import "kumachan/standalone/util/backports/constraints"
  3. type Map[K any, V any] struct {
  4. AVL *AVL[Pair[K,V]]
  5. Cmp Compare[Pair[K,V]]
  6. }
  7. func MakeMap[K any, V any] (cmp Compare[K], entries ...Pair[K,V]) Map[K,V] {
  8. var m = Map[K,V] {
  9. AVL: nil,
  10. Cmp: func(left Pair[K,V], right Pair[K,V]) Ordering {
  11. return cmp(left.Key(), right.Key())
  12. },
  13. }
  14. for _, entry := range entries {
  15. m = m.Inserted(entry.Key(), entry.Value())
  16. }
  17. return m
  18. }
  19. func ToOrderedMap[K constraints.Ordered, V any] (h (map[K] V)) Map[K,V] {
  20. var m = MakeMutMap[K,V](func(left K, right K) Ordering {
  21. if left < right {
  22. return Smaller
  23. } else if left == right {
  24. return Equal
  25. } else {
  26. return Bigger
  27. }
  28. })
  29. for k, v := range h {
  30. m.Insert(k, v)
  31. }
  32. return m.Map()
  33. }
  34. func (m Map[K,V]) IsEmpty() bool {
  35. return m.AVL == nil
  36. }
  37. func (m Map[K,V]) Size() int {
  38. return int(m.AVL.GetSize())
  39. }
  40. func (m Map[K,V]) from(a *AVL[Pair[K,V]]) Map[K,V] {
  41. return Map[K,V] { AVL: a, Cmp: m.Cmp }
  42. }
  43. func (m Map[K,V]) ForEach(f func(K,V)) {
  44. m.AVL.Walk(func(entry Pair[K,V]) {
  45. f(entry.Key(), entry.Value())
  46. })
  47. }
  48. func (m Map[K,V]) Has(k K) bool {
  49. var _, found = m.Lookup(k)
  50. return found
  51. }
  52. func (m Map[K,V]) Lookup(k K) (V, bool) {
  53. var entry, exists = m.AVL.Lookup(MakePair(k, zero[V]()), m.Cmp)
  54. if exists {
  55. return entry.Value(), true
  56. } else {
  57. return zero[V](), false
  58. }
  59. }
  60. func (m Map[K,V]) Inserted(k K, v V) Map[K,V] {
  61. var arg = MakePair(k, v)
  62. var inserted, _ = m.AVL.Inserted(arg, m.Cmp)
  63. return m.from(inserted)
  64. }
  65. func (m Map[K,V]) Deleted(k K) (V, Map[K,V], bool) {
  66. var arg = MakePair(k, zero[V]())
  67. var entry, deleted, exists = m.AVL.Deleted(arg, m.Cmp)
  68. if exists {
  69. return entry.Value(), m.from(deleted), true
  70. } else {
  71. return zero[V](), m, false
  72. }
  73. }
  74. func (m Map[K,V]) MergedWith(another Map[K,V]) Map[K,V] {
  75. var draft = m
  76. another.ForEach(func(k K, v V) {
  77. draft = draft.Inserted(k, v)
  78. })
  79. return draft
  80. }
  81. func (m Map[K,V]) MutMap() MutMap[K,V] {
  82. var ptr = new(Map[K,V])
  83. *ptr = m
  84. return MutMap[K,V] { ptr }
  85. }
  86. type MutMap[K any, V any] struct { ptr *Map[K,V] }
  87. func MakeMutMap[K any, V any] (cmp Compare[K], entries ...Pair[K,V]) MutMap[K,V] {
  88. var m = MakeMap[K,V](cmp, entries...)
  89. return MutMap[K,V] { &m }
  90. }
  91. func (mm MutMap[K,V]) Map() Map[K,V] {
  92. return *(mm.ptr)
  93. }
  94. func (mm MutMap[K,V]) ForEach(f func(K,V)) {
  95. mm.ptr.ForEach(f)
  96. }
  97. func (mm MutMap[K,V]) Has(k K) bool {
  98. return mm.ptr.Has(k)
  99. }
  100. func (mm MutMap[K,V]) Lookup(k K) (V, bool) {
  101. return mm.ptr.Lookup(k)
  102. }
  103. func (mm MutMap[K,V]) Insert(k K, v V) {
  104. var inserted = mm.ptr.Inserted(k, v)
  105. *(mm.ptr) = inserted
  106. }
  107. func (mm MutMap[K,V]) Delete(k K) (V, bool) {
  108. var value, deleted, ok = mm.ptr.Deleted(k)
  109. *(mm.ptr) = deleted
  110. return value, ok
  111. }
  112. func (mm MutMap[K,V]) Size() int {
  113. return mm.ptr.Size()
  114. }
  115. func (mm MutMap[K,V]) Clone() MutMap[K,V] {
  116. return (*(mm.ptr)).MutMap()
  117. }
  118. func (mm MutMap[K,V]) FilterClone(f func(K,V)(bool)) MutMap[K,V] {
  119. var m = *(mm.ptr)
  120. mm.ptr.ForEach(func(k K, v V) {
  121. if !(f(k,v)) {
  122. _, m, _ = m.Deleted(k)
  123. }
  124. })
  125. return m.MutMap()
  126. }
  127. func Keys[K any, V any] (f func(func(K,V))) ([] K) {
  128. var keys = make([] K, 0)
  129. f(func(k K, _ V) {
  130. keys = append(keys, k)
  131. })
  132. return keys
  133. }
  134. func Values[K any, V any] (f func(func(K,V))) ([] V) {
  135. var values = make([] V, 0)
  136. f(func(_ K, v V) {
  137. values = append(values, v)
  138. })
  139. return values
  140. }
  141. func Entries[K any, V any] (f func(func(K,V))) ([] Pair[K,V]) {
  142. var entries = make([] Pair[K,V], 0)
  143. f(func(k K, v V) {
  144. entries = append(entries, MakePair(k, v))
  145. })
  146. return entries
  147. }