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 }