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 }