private async Task <IReadOnlyDictionary <String, TApi> > getLatestAsync <TApi, TJson>(
     LatestDataListRequest request,
     String items,
     Func <JsonLatestData <JsonHistoricalCryptoQuote>, Dictionary <String, TJson> > itemsSelector,
     CancellationToken cancellationToken)
     where TJson : TApi, ISymbolMutable =>
 await getLatestAsync <TApi, TJson>(
     await request.EnsureNotNull(nameof(request)).Validate()
     .GetUriBuilderAsync(_httpClient, items).ConfigureAwait(false),
     itemsSelector, cancellationToken).ConfigureAwait(false);
 public Task <IReadOnlyDictionary <String, IQuote> > ListLatestQuotesAsync(
     LatestDataListRequest request,
     CancellationToken cancellationToken = default) =>
 getLatestAsync <IQuote, JsonHistoricalCryptoQuote>(
     request, "quotes", _ => _.Quotes, cancellationToken);
 public Task <IReadOnlyDictionary <String, IBar> > ListLatestBarsAsync(
     LatestDataListRequest request,
     CancellationToken cancellationToken = default) =>
 getLatestAsync <IBar, JsonHistoricalBar>(
     request, "bars", _ => _.Bars, cancellationToken);
 public Task <IReadOnlyDictionary <String, ITrade> > ListLatestTradesAsync(
     LatestDataListRequest request,
     CancellationToken cancellationToken = default) =>
 getLatestAsync <ITrade, JsonHistoricalTrade>(
     request, "trades", _ => _.Trades, cancellationToken);