github.com/zhiqiangxu/util@v0.0.0-20230112053021-0a7aee056cd5/concurrent/bucket.go (about)

     1  package concurrent
     2  
     3  type Bucket[K any, E any] struct {
     4  	hash     func(K) uint32
     5  	elements []E
     6  }
     7  
     8  func NewBucket[K any, E any](buckets int, genFunc func() E, hash func(K) uint32) *Bucket[K, E] {
     9  	elements := make([]E, 0, buckets)
    10  	for i := 0; i < buckets; i++ {
    11  		elements = append(elements, genFunc())
    12  	}
    13  
    14  	return &Bucket[K, E]{elements: elements, hash: hash}
    15  }
    16  
    17  func (b *Bucket[K, E]) Element(key K) E {
    18  	idx := b.hash(key)
    19  	return b.elements[int(idx)%len(b.elements)]
    20  }
    21  
    22  func (b *Bucket[K, E]) Range(fn func(i int, e E)) {
    23  	for i := 0; i < len(b.elements); i++ {
    24  		fn(i, b.elements[i])
    25  	}
    26  }