code: func (p *TreePool) reserve() *tree {
  	p.lock.Lock()
  	defer p.lock.Unlock()
  	var t *tree
  	if p.count == p.Capacity {
  		return <-p.c
  	}
  	select {
  	case t = <-p.c:
  	default:
  		t = newTree(p.SegmentSize, p.Depth, p.hasher)
  		p.count++
  	}
  	return t
  }
docs: // Reserve is blocking until it returns an available tree
  // it reuses free trees or creates a new one if size is not reached
  // TODO: should use a context here