code: @Override
  	public Promise<Void> put(@Nullable T value) {
  		assert put == null;
  		if (exception == null) {
  			if (take != null) {
  				SettablePromise<T> take = this.take;
  				this.take = null;
  				take.set(value);
  				return Promise.complete();
  			}
  
  			this.value = value;
  			this.put = new SettablePromise<>();
  			return put;
  		} else {
  			tryRecycle(value);
  			return Promise.ofException(exception);
  		}
  	}
docs: Sets the provided {@code value} to current {@code value},
  then sets {@code put} as a new {@link SettablePromise}
  and returns it.
  <p>
  If {@code take} isn't {@code null}, the {@code value}
  will be set to it.
  <p>
  Current {@code put} must be {@code null}. If current
  {@code exception} is not {@code null}, provided
  {@code value} will be recycled and a promise of the
  exception will be returned.
  
  @param value a value passed to the buffer
  @return {@code put} if current {@code take} is {@code null},
  otherwise returns a successfully completed promise. If
  current {@code exception} is not {@code null}, a promise of
  the {@code exception} will be returned.