gitee.com/h79/goutils@v1.22.10/common/queue/item.go (about)

     1  package queue
     2  
     3  import (
     4  	"reflect"
     5  	"time"
     6  )
     7  
     8  // priorityItem 优先级
     9  type priorityItem struct {
    10  	Value    any
    11  	Priority int64
    12  }
    13  
    14  func (it *priorityItem) GValue() any {
    15  	return it.Value
    16  }
    17  
    18  func (it *priorityItem) PValue() int64 {
    19  	return it.Priority
    20  }
    21  
    22  type GeneratePriorityFn func() int64
    23  
    24  func WithUnixNano(l *time.Location) GeneratePriorityFn {
    25  	return func() int64 {
    26  		return time.Now().In(l).UnixNano()
    27  	}
    28  }
    29  
    30  func NewPriorityItem(elem any, fn GeneratePriorityFn) IPriority {
    31  	if p, ok := elem.(*priorityItem); ok {
    32  		return p
    33  	}
    34  	if it, ok := elem.(priorityItem); ok {
    35  		return &it
    36  	}
    37  	val := reflect.ValueOf(elem)
    38  	if val.CanInterface() && val.Type().Implements(PriorityType) {
    39  		fm := val.Interface().(IPriority)
    40  		return fm
    41  	}
    42  	return &priorityItem{Value: elem, Priority: fn()}
    43  }