public static ValueTask <T> DeserializeAsync <T>(
            PipeReader reader,
            CborOptions?options     = null,
            CancellationToken token = default)
        {
            ValueTask <ReadOnlySequence <byte> > task = reader.FullReadAsync(token);

            if (task.IsCompletedSuccessfully)
            {
                ReadOnlySequence <byte> sequence = task.Result;
                T result = Deserialize <T>(sequence.GetSpan(), options);
                reader.AdvanceTo(sequence.End);
                return(new ValueTask <T>(result));
            }

            return(FinishDeserializeAsync(task));

            async ValueTask <T> FinishDeserializeAsync(ValueTask <ReadOnlySequence <byte> > localTask)
            {
                ReadOnlySequence <byte> sequence = await localTask.ConfigureAwait(false);

                T result = Deserialize <T>(sequence.GetSpan(), options);

                reader.AdvanceTo(sequence.End);
                return(result);
            }
        }