From 7eb889793bf7557fbc07f4eba978c0e1e41a385b Mon Sep 17 00:00:00 2001 From: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> Date: Wed, 4 Oct 2023 17:35:42 -0400 Subject: [PATCH 01/13] add heap queue --- utils/heap/queue.go | 84 ++++++++++++++++++++ utils/heap/queue_test.go | 74 +++++++++++++++++ vms/platformvm/state/staker_diff_iterator.go | 53 +++++------- 3 files changed, 176 insertions(+), 35 deletions(-) create mode 100644 utils/heap/queue.go create mode 100644 utils/heap/queue_test.go diff --git a/utils/heap/queue.go b/utils/heap/queue.go new file mode 100644 index 000000000000..4d05158265c5 --- /dev/null +++ b/utils/heap/queue.go @@ -0,0 +1,84 @@ +// Copyright (C) 2019-2023, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package heap + +import ( + stdheap "container/heap" + "github.com/ava-labs/avalanchego/utils" +) + +var _ stdheap.Interface = (*queue[int])(nil) + +// NewQueue returns an empty min-heap ordered by less. See OfQueue for more. +func NewQueue[T any](less func(a, b T) bool) Queue[T] { + return Queue[T]{ + queue: &queue[T]{ + entries: make([]T, 0), + less: less, + }, + } +} + +type Queue[T any] struct { + queue *queue[T] +} + +func (q *Queue[T]) Len() int { + return len(q.queue.entries) +} + +func (q *Queue[T]) Push(t T) { + stdheap.Push(q.queue, t) +} + +func (q *Queue[T]) Pop() (T, bool) { + if q.Len() == 0 { + return utils.Zero[T](), false + } + + return stdheap.Pop(q.queue).(T), true +} + +func (q *Queue[T]) Peek() (T, bool) { + if q.Len() == 0 { + return utils.Zero[T](), false + } + + return q.queue.entries[0], true +} + +func (q *Queue[T]) Fix(i int) { + stdheap.Fix(q.queue, i) +} + +type queue[T any] struct { + entries []T + less func(a, b T) bool +} + +func (q *queue[T]) Len() int { + return len(q.entries) +} + +func (q *queue[T]) Less(i, j int) bool { + return q.less(q.entries[i], q.entries[j]) +} + +func (q *queue[T]) Swap(i, j int) { + q.entries[i], q.entries[j] = q.entries[j], q.entries[i] +} + +func (q *queue[T]) Push(e any) { + q.entries = append(q.entries, e.(T)) +} + +func (q *queue[T]) Pop() any { + end := len(q.entries) - 1 + + popped := q.entries[end] + q.entries[end] = utils.Zero[T]() + q.entries = q.entries[:end] + + return popped +} diff --git a/utils/heap/queue_test.go b/utils/heap/queue_test.go new file mode 100644 index 000000000000..19eec2bd4c71 --- /dev/null +++ b/utils/heap/queue_test.go @@ -0,0 +1,74 @@ +// Copyright (C) 2019-2023, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package heap + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestHeap(t *testing.T) { + tests := []struct { + name string + setup func(h Queue[int]) + expected []int + }{ + { + name: "only push", + setup: func(h Queue[int]) { + h.Push(1) + h.Push(2) + h.Push(3) + + }, + expected: []int{1, 2, 3}, + }, + { + name: "out of order pushes", + setup: func(h Queue[int]) { + h.Push(1) + h.Push(5) + h.Push(2) + h.Push(4) + h.Push(3) + }, + expected: []int{1, 2, 3, 4, 5}, + }, + { + name: "push and pop", + setup: func(h Queue[int]) { + h.Push(1) + h.Push(5) + h.Push(2) + h.Push(4) + h.Push(3) + h.Pop() + h.Pop() + h.Pop() + }, + expected: []int{4, 5}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require := require.New(t) + + h := NewQueue[int](func(a, b int) bool { + return a < b + }) + + tt.setup(h) + + require.Equal(len(tt.expected), h.Len()) + for _, expected := range tt.expected { + got, ok := h.Pop() + require.True(ok) + require.Equal(expected, got) + } + }) + } + +} diff --git a/vms/platformvm/state/staker_diff_iterator.go b/vms/platformvm/state/staker_diff_iterator.go index e92f63079304..82ef07fcfa43 100644 --- a/vms/platformvm/state/staker_diff_iterator.go +++ b/vms/platformvm/state/staker_diff_iterator.go @@ -4,15 +4,13 @@ package state import ( - "container/heap" - + "github.com/ava-labs/avalanchego/utils/heap" "github.com/ava-labs/avalanchego/vms/platformvm/txs" ) var ( _ StakerDiffIterator = (*stakerDiffIterator)(nil) _ StakerIterator = (*mutableStakerIterator)(nil) - _ heap.Interface = (*mutableStakerIterator)(nil) ) // StakerDiffIterator is an iterator that iterates over the events that will be @@ -114,38 +112,46 @@ func (it *stakerDiffIterator) advancePending() { type mutableStakerIterator struct { iteratorExhausted bool iterator StakerIterator - heap []*Staker + heap heap.Queue[*Staker] +} + +func newStakerHeap() heap.Queue[*Staker] { + return heap.NewQueue[*Staker](func(a, b *Staker) bool { + return a.Less(b) + }) } func newMutableStakerIterator(iterator StakerIterator) *mutableStakerIterator { return &mutableStakerIterator{ iteratorExhausted: !iterator.Next(), iterator: iterator, + heap: newStakerHeap(), } } // Add should not be called until after Next has been called at least once. func (it *mutableStakerIterator) Add(staker *Staker) { - heap.Push(it, staker) + it.heap.Push(staker) } func (it *mutableStakerIterator) Next() bool { // The only time the heap should be empty - is when the iterator is // exhausted or uninitialized. - if len(it.heap) > 0 { - heap.Pop(it) + if it.heap.Len() > 0 { + it.heap.Pop() } // If the iterator is exhausted, the only elements left to iterate over are // in the heap. if it.iteratorExhausted { - return len(it.heap) > 0 + return it.heap.Len() > 0 } // If the heap doesn't contain the next staker to return, we need to move // the next element from the iterator into the heap. nextIteratorStaker := it.iterator.Value() - if len(it.heap) == 0 || nextIteratorStaker.Less(it.heap[0]) { + peek, ok := it.heap.Peek() + if !ok || nextIteratorStaker.Less(peek) { it.Add(nextIteratorStaker) it.iteratorExhausted = !it.iterator.Next() } @@ -153,35 +159,12 @@ func (it *mutableStakerIterator) Next() bool { } func (it *mutableStakerIterator) Value() *Staker { - return it.heap[0] + peek, _ := it.heap.Peek() + return peek } func (it *mutableStakerIterator) Release() { it.iteratorExhausted = true it.iterator.Release() - it.heap = nil -} - -func (it *mutableStakerIterator) Len() int { - return len(it.heap) -} - -func (it *mutableStakerIterator) Less(i, j int) bool { - return it.heap[i].Less(it.heap[j]) -} - -func (it *mutableStakerIterator) Swap(i, j int) { - it.heap[j], it.heap[i] = it.heap[i], it.heap[j] -} - -func (it *mutableStakerIterator) Push(value interface{}) { - it.heap = append(it.heap, value.(*Staker)) -} - -func (it *mutableStakerIterator) Pop() interface{} { - newLength := len(it.heap) - 1 - value := it.heap[newLength] - it.heap[newLength] = nil - it.heap = it.heap[:newLength] - return value + it.heap = newStakerHeap() } From d6e3e9cd7577e3d526857357203cb51d81837eea Mon Sep 17 00:00:00 2001 From: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> Date: Wed, 4 Oct 2023 18:00:36 -0400 Subject: [PATCH 02/13] nit --- utils/heap/queue.go | 12 ++++- vms/platformvm/state/merged_iterator.go | 62 ++++++++----------------- 2 files changed, 30 insertions(+), 44 deletions(-) diff --git a/utils/heap/queue.go b/utils/heap/queue.go index 4d05158265c5..e5c446afcd9c 100644 --- a/utils/heap/queue.go +++ b/utils/heap/queue.go @@ -10,14 +10,22 @@ import ( var _ stdheap.Interface = (*queue[int])(nil) -// NewQueue returns an empty min-heap ordered by less. See OfQueue for more. +// NewQueue returns an empty min-heap ordered by less. See QueueOf for more. func NewQueue[T any](less func(a, b T) bool) Queue[T] { - return Queue[T]{ + return QueueOf(less) +} + +func QueueOf[T any](less func(a, b T) bool, entries ...T) Queue[T] { + q := Queue[T]{ queue: &queue[T]{ entries: make([]T, 0), less: less, }, } + + for _, e := range entries { + q.Push(e) + } } type Queue[T any] struct { diff --git a/vms/platformvm/state/merged_iterator.go b/vms/platformvm/state/merged_iterator.go index 2be90a1a3106..08a7e34811b2 100644 --- a/vms/platformvm/state/merged_iterator.go +++ b/vms/platformvm/state/merged_iterator.go @@ -3,18 +3,15 @@ package state -import "container/heap" +import "github.com/ava-labs/avalanchego/utils/heap" -var ( - _ StakerIterator = (*mergedIterator)(nil) - _ heap.Interface = (*mergedIterator)(nil) -) +var _ StakerIterator = (*mergedIterator)(nil) type mergedIterator struct { initialized bool // heap only contains iterators that have been initialized and are not // exhausted. - heap []StakerIterator + heap heap.Queue[StakerIterator] } // Returns an iterator that returns all of the elements of [stakers] in order. @@ -36,15 +33,19 @@ func NewMergedIterator(stakers ...StakerIterator) StakerIterator { } it := &mergedIterator{ - heap: stakers, + heap: heap.OfQueue[StakerIterator]( + func(a, b StakerIterator) bool { + return a.Value().Less(b.Value()) + }, + stakers..., + ), } - heap.Init(it) return it } func (it *mergedIterator) Next() bool { - if len(it.heap) == 0 { + if it.heap.Len() == 0 { return false } @@ -57,54 +58,31 @@ func (it *mergedIterator) Next() bool { } // Update the heap root. - current := it.heap[0] + current, _ := it.heap.Peek() if current.Next() { // Calling Next() above modifies [current] so we fix the heap. - heap.Fix(it, 0) + it.heap.Fix(0) return true } // The old root is exhausted. Remove it from the heap. current.Release() - heap.Pop(it) - return len(it.heap) > 0 + it.heap.Pop() + return it.heap.Len() > 0 } func (it *mergedIterator) Value() *Staker { - return it.heap[0].Value() + peek, _ := it.heap.Peek() + return peek.Value() } -// When Release() returns, Release() has been called on each element of -// [stakers]. func (it *mergedIterator) Release() { - for _, it := range it.heap { - it.Release() + for it.heap.Len() > 0 { + removed, _ := it.heap.Pop() + removed.Release() } - it.heap = nil } -// Returns the number of sub-iterators in [it]. func (it *mergedIterator) Len() int { - return len(it.heap) -} - -func (it *mergedIterator) Less(i, j int) bool { - return it.heap[i].Value().Less(it.heap[j].Value()) -} - -func (it *mergedIterator) Swap(i, j int) { - it.heap[j], it.heap[i] = it.heap[i], it.heap[j] -} - -// Push is never actually used - but we need it to implement heap.Interface. -func (it *mergedIterator) Push(value interface{}) { - it.heap = append(it.heap, value.(StakerIterator)) -} - -func (it *mergedIterator) Pop() interface{} { - newLength := len(it.heap) - 1 - value := it.heap[newLength] - it.heap[newLength] = nil - it.heap = it.heap[:newLength] - return value + return it.heap.Len() } From 3776354479648cdfb86977b60a3c960fa38f6ab8 Mon Sep 17 00:00:00 2001 From: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> Date: Wed, 4 Oct 2023 18:06:13 -0400 Subject: [PATCH 03/13] nit --- utils/heap/queue.go | 2 ++ vms/platformvm/state/merged_iterator.go | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/utils/heap/queue.go b/utils/heap/queue.go index e5c446afcd9c..665921085c9f 100644 --- a/utils/heap/queue.go +++ b/utils/heap/queue.go @@ -26,6 +26,8 @@ func QueueOf[T any](less func(a, b T) bool, entries ...T) Queue[T] { for _, e := range entries { q.Push(e) } + + return q } type Queue[T any] struct { diff --git a/vms/platformvm/state/merged_iterator.go b/vms/platformvm/state/merged_iterator.go index 08a7e34811b2..46f033f3b612 100644 --- a/vms/platformvm/state/merged_iterator.go +++ b/vms/platformvm/state/merged_iterator.go @@ -33,7 +33,7 @@ func NewMergedIterator(stakers ...StakerIterator) StakerIterator { } it := &mergedIterator{ - heap: heap.OfQueue[StakerIterator]( + heap: heap.QueueOf[StakerIterator]( func(a, b StakerIterator) bool { return a.Value().Less(b.Value()) }, From 1e2989ab9958af1d75293f94d354bc4461300b26 Mon Sep 17 00:00:00 2001 From: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> Date: Wed, 4 Oct 2023 18:15:42 -0400 Subject: [PATCH 04/13] linter --- utils/heap/queue.go | 1 + utils/heap/queue_test.go | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/utils/heap/queue.go b/utils/heap/queue.go index 665921085c9f..fd5caed326c5 100644 --- a/utils/heap/queue.go +++ b/utils/heap/queue.go @@ -5,6 +5,7 @@ package heap import ( stdheap "container/heap" + "github.com/ava-labs/avalanchego/utils" ) diff --git a/utils/heap/queue_test.go b/utils/heap/queue_test.go index 19eec2bd4c71..e7481eddbbe3 100644 --- a/utils/heap/queue_test.go +++ b/utils/heap/queue_test.go @@ -21,7 +21,6 @@ func TestHeap(t *testing.T) { h.Push(1) h.Push(2) h.Push(3) - }, expected: []int{1, 2, 3}, }, @@ -70,5 +69,4 @@ func TestHeap(t *testing.T) { } }) } - } From 4367be5d3cbcc989a7408b5ab99ab2ed63737dd8 Mon Sep 17 00:00:00 2001 From: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> Date: Wed, 4 Oct 2023 18:45:23 -0400 Subject: [PATCH 05/13] nit --- utils/heap/queue.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/utils/heap/queue.go b/utils/heap/queue.go index fd5caed326c5..cd89c16782f1 100644 --- a/utils/heap/queue.go +++ b/utils/heap/queue.go @@ -19,14 +19,13 @@ func NewQueue[T any](less func(a, b T) bool) Queue[T] { func QueueOf[T any](less func(a, b T) bool, entries ...T) Queue[T] { q := Queue[T]{ queue: &queue[T]{ - entries: make([]T, 0), + entries: make([]T, 0, len(entries)), less: less, }, } - for _, e := range entries { - q.Push(e) - } + q.queue.entries = append(q.queue.entries, entries...) + stdheap.Init(q.queue) return q } From dd64a435f7c597be4fdd6420ff8d0684ce448dd6 Mon Sep 17 00:00:00 2001 From: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> Date: Wed, 4 Oct 2023 18:49:18 -0400 Subject: [PATCH 06/13] nit --- utils/heap/queue.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/utils/heap/queue.go b/utils/heap/queue.go index cd89c16782f1..46d9d869fdab 100644 --- a/utils/heap/queue.go +++ b/utils/heap/queue.go @@ -19,14 +19,12 @@ func NewQueue[T any](less func(a, b T) bool) Queue[T] { func QueueOf[T any](less func(a, b T) bool, entries ...T) Queue[T] { q := Queue[T]{ queue: &queue[T]{ - entries: make([]T, 0, len(entries)), + entries: entries, less: less, }, } - q.queue.entries = append(q.queue.entries, entries...) stdheap.Init(q.queue) - return q } From fe58f6d2b353bf0f405183cb08fa33886883fa08 Mon Sep 17 00:00:00 2001 From: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> Date: Wed, 4 Oct 2023 18:54:03 -0400 Subject: [PATCH 07/13] nit --- utils/heap/queue.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/heap/queue.go b/utils/heap/queue.go index 46d9d869fdab..d6ab897acb0a 100644 --- a/utils/heap/queue.go +++ b/utils/heap/queue.go @@ -19,11 +19,12 @@ func NewQueue[T any](less func(a, b T) bool) Queue[T] { func QueueOf[T any](less func(a, b T) bool, entries ...T) Queue[T] { q := Queue[T]{ queue: &queue[T]{ - entries: entries, + entries: make([]T, 0, len(entries)), less: less, }, } + copy(q.queue.entries, entries) stdheap.Init(q.queue) return q } From c07f112e13e41c871d50d4f16710015cb9893670 Mon Sep 17 00:00:00 2001 From: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> Date: Wed, 4 Oct 2023 18:54:58 -0400 Subject: [PATCH 08/13] nit --- utils/heap/queue.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/heap/queue.go b/utils/heap/queue.go index d6ab897acb0a..505e53e89418 100644 --- a/utils/heap/queue.go +++ b/utils/heap/queue.go @@ -11,11 +11,12 @@ import ( var _ stdheap.Interface = (*queue[int])(nil) -// NewQueue returns an empty min-heap ordered by less. See QueueOf for more. +// NewQueue returns an empty heap. See QueueOf for more. func NewQueue[T any](less func(a, b T) bool) Queue[T] { return QueueOf(less) } +// QueueOf returns a heap containing entries ordered by less. func QueueOf[T any](less func(a, b T) bool, entries ...T) Queue[T] { q := Queue[T]{ queue: &queue[T]{ From 03eae28d58abf72289b952fe2d627ce4d1008639 Mon Sep 17 00:00:00 2001 From: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> Date: Thu, 5 Oct 2023 14:49:39 -0400 Subject: [PATCH 09/13] Update utils/heap/queue.go Co-authored-by: Stephen Buttolph Signed-off-by: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> --- utils/heap/queue.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/heap/queue.go b/utils/heap/queue.go index 505e53e89418..59ef534f0160 100644 --- a/utils/heap/queue.go +++ b/utils/heap/queue.go @@ -20,7 +20,7 @@ func NewQueue[T any](less func(a, b T) bool) Queue[T] { func QueueOf[T any](less func(a, b T) bool, entries ...T) Queue[T] { q := Queue[T]{ queue: &queue[T]{ - entries: make([]T, 0, len(entries)), + entries: make([]T, len(entries)), less: less, }, } From 32ccd54dce1b714c16f881d3652ed46618f4e6de Mon Sep 17 00:00:00 2001 From: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> Date: Thu, 5 Oct 2023 14:49:47 -0400 Subject: [PATCH 10/13] Update vms/platformvm/state/merged_iterator.go Co-authored-by: Stephen Buttolph Signed-off-by: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> --- vms/platformvm/state/merged_iterator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vms/platformvm/state/merged_iterator.go b/vms/platformvm/state/merged_iterator.go index 46f033f3b612..6c5bdafe801e 100644 --- a/vms/platformvm/state/merged_iterator.go +++ b/vms/platformvm/state/merged_iterator.go @@ -33,7 +33,7 @@ func NewMergedIterator(stakers ...StakerIterator) StakerIterator { } it := &mergedIterator{ - heap: heap.QueueOf[StakerIterator]( + heap: heap.QueueOf( func(a, b StakerIterator) bool { return a.Value().Less(b.Value()) }, From a57f560652530cd17b380b4f0ff5020464c94d1c Mon Sep 17 00:00:00 2001 From: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> Date: Thu, 5 Oct 2023 14:49:53 -0400 Subject: [PATCH 11/13] Update vms/platformvm/state/staker_diff_iterator.go Co-authored-by: Stephen Buttolph Signed-off-by: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> --- vms/platformvm/state/staker_diff_iterator.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/vms/platformvm/state/staker_diff_iterator.go b/vms/platformvm/state/staker_diff_iterator.go index 82ef07fcfa43..ff5270bbec98 100644 --- a/vms/platformvm/state/staker_diff_iterator.go +++ b/vms/platformvm/state/staker_diff_iterator.go @@ -116,9 +116,7 @@ type mutableStakerIterator struct { } func newStakerHeap() heap.Queue[*Staker] { - return heap.NewQueue[*Staker](func(a, b *Staker) bool { - return a.Less(b) - }) + return heap.NewQueue((*Staker).Less) } func newMutableStakerIterator(iterator StakerIterator) *mutableStakerIterator { From 062b5ce3e68c961a6a108bf4153e7d25684e6fd3 Mon Sep 17 00:00:00 2001 From: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> Date: Thu, 5 Oct 2023 15:07:04 -0400 Subject: [PATCH 12/13] nit --- utils/heap/queue.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/utils/heap/queue.go b/utils/heap/queue.go index 59ef534f0160..fc3bebaa0b8d 100644 --- a/utils/heap/queue.go +++ b/utils/heap/queue.go @@ -4,12 +4,12 @@ package heap import ( - stdheap "container/heap" + "container/heap" "github.com/ava-labs/avalanchego/utils" ) -var _ stdheap.Interface = (*queue[int])(nil) +var _ heap.Interface = (*queue[int])(nil) // NewQueue returns an empty heap. See QueueOf for more. func NewQueue[T any](less func(a, b T) bool) Queue[T] { @@ -26,7 +26,7 @@ func QueueOf[T any](less func(a, b T) bool, entries ...T) Queue[T] { } copy(q.queue.entries, entries) - stdheap.Init(q.queue) + heap.Init(q.queue) return q } @@ -39,7 +39,7 @@ func (q *Queue[T]) Len() int { } func (q *Queue[T]) Push(t T) { - stdheap.Push(q.queue, t) + heap.Push(q.queue, t) } func (q *Queue[T]) Pop() (T, bool) { @@ -47,7 +47,7 @@ func (q *Queue[T]) Pop() (T, bool) { return utils.Zero[T](), false } - return stdheap.Pop(q.queue).(T), true + return heap.Pop(q.queue).(T), true } func (q *Queue[T]) Peek() (T, bool) { @@ -59,7 +59,7 @@ func (q *Queue[T]) Peek() (T, bool) { } func (q *Queue[T]) Fix(i int) { - stdheap.Fix(q.queue, i) + heap.Fix(q.queue, i) } type queue[T any] struct { From 545d7af2519e7aff0419b434d59a74344868eeee Mon Sep 17 00:00:00 2001 From: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> Date: Thu, 5 Oct 2023 15:49:57 -0400 Subject: [PATCH 13/13] nit Signed-off-by: Joshua Kim <20001595+joshua-kim@users.noreply.github.com> --- vms/platformvm/state/staker_diff_iterator.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/vms/platformvm/state/staker_diff_iterator.go b/vms/platformvm/state/staker_diff_iterator.go index ff5270bbec98..d9c194cd2702 100644 --- a/vms/platformvm/state/staker_diff_iterator.go +++ b/vms/platformvm/state/staker_diff_iterator.go @@ -115,15 +115,11 @@ type mutableStakerIterator struct { heap heap.Queue[*Staker] } -func newStakerHeap() heap.Queue[*Staker] { - return heap.NewQueue((*Staker).Less) -} - func newMutableStakerIterator(iterator StakerIterator) *mutableStakerIterator { return &mutableStakerIterator{ iteratorExhausted: !iterator.Next(), iterator: iterator, - heap: newStakerHeap(), + heap: heap.NewQueue((*Staker).Less), } } @@ -164,5 +160,5 @@ func (it *mutableStakerIterator) Value() *Staker { func (it *mutableStakerIterator) Release() { it.iteratorExhausted = true it.iterator.Release() - it.heap = newStakerHeap() + it.heap = heap.NewQueue((*Staker).Less) }