heap.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package ctn
  2. type Heap[T any] struct {
  3. LTT *LTT[T]
  4. LtOp LessThanOperator[T]
  5. }
  6. func MakeHeap[T any] (lt LessThanOperator[T]) Heap[T] {
  7. return Heap[T] { LTT: nil, LtOp: lt }
  8. }
  9. func (h Heap[T]) from(t *LTT[T]) Heap[T] {
  10. return Heap[T] { LTT: t, LtOp: h.LtOp }
  11. }
  12. func (h Heap[T]) Error() string {
  13. panic("dummy method")
  14. }
  15. func (h Heap[T]) ForEach(f func(v T)) {
  16. var current = h
  17. for { if v, next, ok := current.Shifted(); ok {
  18. f(v)
  19. current = next
  20. } else {
  21. break
  22. }}
  23. }
  24. func (h Heap[T]) Inserted(v T) Heap[T] {
  25. return h.from(h.LTT.Pushed(v, h.LtOp))
  26. }
  27. func (h Heap[T]) Shifted() (T, Heap[T], bool) {
  28. var popped, rest, exists = h.LTT.Popped(h.LtOp)
  29. return popped, h.from(rest), exists
  30. }
  31. func (h Heap[T]) First() (T, bool) {
  32. return h.LTT.Top()
  33. }
  34. func (h Heap[T]) IsEmpty() bool {
  35. return (h.LTT == nil)
  36. }
  37. func (h Heap[T]) Size() int {
  38. return int(h.LTT.GetSize())
  39. }
  40. func (h Heap[T]) MutHeap() MutHeap[T] {
  41. var ptr = new(Heap[T])
  42. *ptr = h
  43. return MutHeap[T] { ptr }
  44. }
  45. type MutHeap[T any] struct { ptr *Heap[T] }
  46. func MakeMutHeap[T any] (lt LessThanOperator[T]) MutHeap[T] {
  47. var h = MakeHeap(lt)
  48. return MutHeap[T] { &h }
  49. }
  50. func (mh MutHeap[T]) Heap() Heap[T] {
  51. return *(mh.ptr)
  52. }
  53. func (mh MutHeap[T]) ForEach(f func(v T)) {
  54. mh.ptr.ForEach(f)
  55. }
  56. func (mh MutHeap[T]) Insert(v T) {
  57. var pushed = mh.ptr.Inserted(v)
  58. *(mh.ptr) = pushed
  59. }
  60. func (mh MutHeap[T]) Shift() (T, bool) {
  61. var v, popped, ok = mh.ptr.Shifted()
  62. *(mh.ptr) = popped
  63. return v, ok
  64. }
  65. func (mh MutHeap[T]) First() (T, bool) {
  66. return mh.ptr.First()
  67. }
  68. func (mh MutHeap[T]) IsEmpty() bool {
  69. return mh.ptr.IsEmpty()
  70. }
  71. func (mh MutHeap[T]) Size() int {
  72. return mh.ptr.Size()
  73. }