function whenFinished(WritableObjectStream $stream) : Promise
{
    $promise = __promise($graceful = true);
    $stream->on('finish', [$promise, 'resolve']);
    $stream->on('error', [$promise, 'resolve']);
    $promise->when(function () use($stream, $promise) {
        $stream->removeListener('finish', [$promise, 'resolve']);
        $stream->removeListener('error', [$promise, 'resolve']);
    });
    return $promise;
}