heap.go 1.5 KB

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