github.com/ngicks/gokugen@v0.0.5/heap/heap.go (about) 1 package heap 2 3 import ( 4 typeparamcommon "github.com/ngicks/type-param-common" 5 ) 6 7 type ExcludableHeap[T any] struct { 8 *typeparamcommon.HeapWrapper[T] 9 internal *typeparamcommon.SliceInterface[T] 10 } 11 12 func NewHeap[T any](less func(i, j T) bool) *ExcludableHeap[T] { 13 if less == nil { 14 return nil 15 } 16 heapInternal, interfaceInternal := typeparamcommon.MakeHeap(less) 17 h := &ExcludableHeap[T]{ 18 HeapWrapper: heapInternal, 19 internal: interfaceInternal, 20 } 21 h.Init() 22 return h 23 } 24 25 func (exh *ExcludableHeap[T]) Len() int { 26 return exh.internal.Len() 27 } 28 func (exh *ExcludableHeap[T]) Exclude(filter func(ent T) bool, start, end int) (removed []T) { 29 if filter == nil { 30 return 31 } 32 33 if start < 0 { 34 start = 0 35 } else if start >= len(exh.internal.Inner) { 36 return 37 } 38 if end > len(exh.internal.Inner) { 39 end = len(exh.internal.Inner) 40 } 41 42 if start > end { 43 return 44 } 45 46 for i := start; i < end; i++ { 47 if filter(exh.internal.Inner[i]) { 48 removed = append(removed, exh.internal.Inner[i]) 49 exh.internal.Inner = append(exh.internal.Inner[:i], exh.internal.Inner[i+1:]...) 50 end-- 51 i-- 52 } 53 } 54 55 exh.Init() 56 return removed 57 } 58 59 func (h *ExcludableHeap[T]) Peek() (p T) { 60 if len(h.internal.Inner) == 0 { 61 return 62 } 63 return h.internal.Inner[0] 64 }