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  }