jackhammer

Utilities for Go
Log | Files | Refs | README | LICENSE

pool.go (570B)


      1 package syncx
      2 
      3 import "sync"
      4 
      5 // Pool wraps a [sync.Pool] providing a type-safe API.
      6 // [validate] is used to optionally ignore [Put] operations.
      7 type Pool[T any] struct {
      8 	sync.Pool
      9 	allocate func() T
     10 	validate func(t T) bool
     11 }
     12 
     13 func NewPool[T any](allocate func() T, validate func(T) bool) *Pool[T] {
     14 	return &Pool[T]{
     15 		allocate: allocate,
     16 		validate: validate,
     17 		Pool: sync.Pool{
     18 			New: func() any {
     19 				return allocate()
     20 			},
     21 		},
     22 	}
     23 }
     24 
     25 func (p *Pool[T]) Get() T {
     26 	return p.Pool.Get().(T)
     27 }
     28 
     29 func (p *Pool[T]) Put(t T) {
     30 	if p.validate(t) {
     31 		p.Pool.Put(t)
     32 	}
     33 }