code: func NewPool(
  	bytesPool pool.CheckedBytesPool,
  	opts PoolOptions,
  ) Pool {
  	opts = opts.defaultsIfNotSet()
  
  	p := &simplePool{
  		bytesPool: bytesPool,
  		pool:      pool.NewObjectPool(opts.IDPoolOptions),
  		tagArrayPool: newTagArrayPool(tagArrayPoolOpts{
  			Options:     opts.TagsPoolOptions,
  			Capacity:    opts.TagsCapacity,
  			MaxCapacity: opts.TagsMaxCapacity,
  		}),
  		itersPool: pool.NewObjectPool(opts.TagsIteratorPoolOptions),
  	}
  	p.pool.Init(func() interface{} {
  		return &id{pool: p}
  	})
  	p.tagArrayPool.Init()
  	p.itersPool.Init(func() interface{} {
  		return newTagSliceIter(Tags{}, p)
  	})
  
  	return p
  }
docs: // NewPool constructs a new simple Pool.