Average.Generated.cs 68 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the Apache 2.0 License.
  3. // See the LICENSE file in the project root for more information.
  4. using System.Collections.Generic;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. namespace System.Linq
  8. {
  9. public static partial class AsyncEnumerable
  10. {
  11. public static Task<double> AverageAsync(this IAsyncEnumerable<int> source, CancellationToken cancellationToken = default)
  12. {
  13. if (source == null)
  14. throw Error.ArgumentNull(nameof(source));
  15. return Core(source, cancellationToken);
  16. static async Task<double> Core(IAsyncEnumerable<int> _source, CancellationToken _cancellationToken)
  17. {
  18. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  19. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  20. {
  21. if (!await e.MoveNextAsync())
  22. {
  23. throw Error.NoElements();
  24. }
  25. long sum = e.Current;
  26. long count = 1;
  27. checked
  28. {
  29. while (await e.MoveNextAsync())
  30. {
  31. sum += e.Current;
  32. ++count;
  33. }
  34. }
  35. return (double)sum / count;
  36. }
  37. finally
  38. {
  39. await e.DisposeAsync();
  40. }
  41. }
  42. }
  43. public static Task<double> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, int> selector, CancellationToken cancellationToken = default)
  44. {
  45. if (source == null)
  46. throw Error.ArgumentNull(nameof(source));
  47. if (selector == null)
  48. throw Error.ArgumentNull(nameof(selector));
  49. return Core(source, selector, cancellationToken);
  50. static async Task<double> Core(IAsyncEnumerable<TSource> _source, Func<TSource, int> _selector, CancellationToken _cancellationToken)
  51. {
  52. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  53. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  54. {
  55. if (!await e.MoveNextAsync())
  56. {
  57. throw Error.NoElements();
  58. }
  59. long sum = _selector(e.Current);
  60. long count = 1;
  61. checked
  62. {
  63. while (await e.MoveNextAsync())
  64. {
  65. sum += _selector(e.Current);
  66. ++count;
  67. }
  68. }
  69. return (double)sum / count;
  70. }
  71. finally
  72. {
  73. await e.DisposeAsync();
  74. }
  75. }
  76. }
  77. public static Task<double> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, ValueTask<int>> selector, CancellationToken cancellationToken = default)
  78. {
  79. if (source == null)
  80. throw Error.ArgumentNull(nameof(source));
  81. if (selector == null)
  82. throw Error.ArgumentNull(nameof(selector));
  83. return Core(source, selector, cancellationToken);
  84. static async Task<double> Core(IAsyncEnumerable<TSource> _source, Func<TSource, ValueTask<int>> _selector, CancellationToken _cancellationToken)
  85. {
  86. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  87. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  88. {
  89. if (!await e.MoveNextAsync())
  90. {
  91. throw Error.NoElements();
  92. }
  93. long sum = await _selector(e.Current).ConfigureAwait(false);
  94. long count = 1;
  95. checked
  96. {
  97. while (await e.MoveNextAsync())
  98. {
  99. sum += await _selector(e.Current).ConfigureAwait(false);
  100. ++count;
  101. }
  102. }
  103. return (double)sum / count;
  104. }
  105. finally
  106. {
  107. await e.DisposeAsync();
  108. }
  109. }
  110. }
  111. #if !NO_DEEP_CANCELLATION
  112. public static Task<double> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, ValueTask<int>> selector, CancellationToken cancellationToken = default)
  113. {
  114. if (source == null)
  115. throw Error.ArgumentNull(nameof(source));
  116. if (selector == null)
  117. throw Error.ArgumentNull(nameof(selector));
  118. return Core(source, selector, cancellationToken);
  119. static async Task<double> Core(IAsyncEnumerable<TSource> _source, Func<TSource, CancellationToken, ValueTask<int>> _selector, CancellationToken _cancellationToken)
  120. {
  121. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  122. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  123. {
  124. if (!await e.MoveNextAsync())
  125. {
  126. throw Error.NoElements();
  127. }
  128. long sum = await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  129. long count = 1;
  130. checked
  131. {
  132. while (await e.MoveNextAsync())
  133. {
  134. sum += await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  135. ++count;
  136. }
  137. }
  138. return (double)sum / count;
  139. }
  140. finally
  141. {
  142. await e.DisposeAsync();
  143. }
  144. }
  145. }
  146. #endif
  147. public static Task<double> AverageAsync(this IAsyncEnumerable<long> source, CancellationToken cancellationToken = default)
  148. {
  149. if (source == null)
  150. throw Error.ArgumentNull(nameof(source));
  151. return Core(source, cancellationToken);
  152. static async Task<double> Core(IAsyncEnumerable<long> _source, CancellationToken _cancellationToken)
  153. {
  154. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  155. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  156. {
  157. if (!await e.MoveNextAsync())
  158. {
  159. throw Error.NoElements();
  160. }
  161. long sum = e.Current;
  162. long count = 1;
  163. checked
  164. {
  165. while (await e.MoveNextAsync())
  166. {
  167. sum += e.Current;
  168. ++count;
  169. }
  170. }
  171. return (double)sum / count;
  172. }
  173. finally
  174. {
  175. await e.DisposeAsync();
  176. }
  177. }
  178. }
  179. public static Task<double> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, long> selector, CancellationToken cancellationToken = default)
  180. {
  181. if (source == null)
  182. throw Error.ArgumentNull(nameof(source));
  183. if (selector == null)
  184. throw Error.ArgumentNull(nameof(selector));
  185. return Core(source, selector, cancellationToken);
  186. static async Task<double> Core(IAsyncEnumerable<TSource> _source, Func<TSource, long> _selector, CancellationToken _cancellationToken)
  187. {
  188. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  189. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  190. {
  191. if (!await e.MoveNextAsync())
  192. {
  193. throw Error.NoElements();
  194. }
  195. long sum = _selector(e.Current);
  196. long count = 1;
  197. checked
  198. {
  199. while (await e.MoveNextAsync())
  200. {
  201. sum += _selector(e.Current);
  202. ++count;
  203. }
  204. }
  205. return (double)sum / count;
  206. }
  207. finally
  208. {
  209. await e.DisposeAsync();
  210. }
  211. }
  212. }
  213. public static Task<double> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, ValueTask<long>> selector, CancellationToken cancellationToken = default)
  214. {
  215. if (source == null)
  216. throw Error.ArgumentNull(nameof(source));
  217. if (selector == null)
  218. throw Error.ArgumentNull(nameof(selector));
  219. return Core(source, selector, cancellationToken);
  220. static async Task<double> Core(IAsyncEnumerable<TSource> _source, Func<TSource, ValueTask<long>> _selector, CancellationToken _cancellationToken)
  221. {
  222. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  223. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  224. {
  225. if (!await e.MoveNextAsync())
  226. {
  227. throw Error.NoElements();
  228. }
  229. long sum = await _selector(e.Current).ConfigureAwait(false);
  230. long count = 1;
  231. checked
  232. {
  233. while (await e.MoveNextAsync())
  234. {
  235. sum += await _selector(e.Current).ConfigureAwait(false);
  236. ++count;
  237. }
  238. }
  239. return (double)sum / count;
  240. }
  241. finally
  242. {
  243. await e.DisposeAsync();
  244. }
  245. }
  246. }
  247. #if !NO_DEEP_CANCELLATION
  248. public static Task<double> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, ValueTask<long>> selector, CancellationToken cancellationToken = default)
  249. {
  250. if (source == null)
  251. throw Error.ArgumentNull(nameof(source));
  252. if (selector == null)
  253. throw Error.ArgumentNull(nameof(selector));
  254. return Core(source, selector, cancellationToken);
  255. static async Task<double> Core(IAsyncEnumerable<TSource> _source, Func<TSource, CancellationToken, ValueTask<long>> _selector, CancellationToken _cancellationToken)
  256. {
  257. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  258. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  259. {
  260. if (!await e.MoveNextAsync())
  261. {
  262. throw Error.NoElements();
  263. }
  264. long sum = await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  265. long count = 1;
  266. checked
  267. {
  268. while (await e.MoveNextAsync())
  269. {
  270. sum += await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  271. ++count;
  272. }
  273. }
  274. return (double)sum / count;
  275. }
  276. finally
  277. {
  278. await e.DisposeAsync();
  279. }
  280. }
  281. }
  282. #endif
  283. public static Task<float> AverageAsync(this IAsyncEnumerable<float> source, CancellationToken cancellationToken = default)
  284. {
  285. if (source == null)
  286. throw Error.ArgumentNull(nameof(source));
  287. return Core(source, cancellationToken);
  288. static async Task<float> Core(IAsyncEnumerable<float> _source, CancellationToken _cancellationToken)
  289. {
  290. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  291. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  292. {
  293. if (!await e.MoveNextAsync())
  294. {
  295. throw Error.NoElements();
  296. }
  297. double sum = e.Current;
  298. long count = 1;
  299. checked
  300. {
  301. while (await e.MoveNextAsync())
  302. {
  303. sum += e.Current;
  304. ++count;
  305. }
  306. }
  307. return (float)(sum / count);
  308. }
  309. finally
  310. {
  311. await e.DisposeAsync();
  312. }
  313. }
  314. }
  315. public static Task<float> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, float> selector, CancellationToken cancellationToken = default)
  316. {
  317. if (source == null)
  318. throw Error.ArgumentNull(nameof(source));
  319. if (selector == null)
  320. throw Error.ArgumentNull(nameof(selector));
  321. return Core(source, selector, cancellationToken);
  322. static async Task<float> Core(IAsyncEnumerable<TSource> _source, Func<TSource, float> _selector, CancellationToken _cancellationToken)
  323. {
  324. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  325. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  326. {
  327. if (!await e.MoveNextAsync())
  328. {
  329. throw Error.NoElements();
  330. }
  331. double sum = _selector(e.Current);
  332. long count = 1;
  333. checked
  334. {
  335. while (await e.MoveNextAsync())
  336. {
  337. sum += _selector(e.Current);
  338. ++count;
  339. }
  340. }
  341. return (float)(sum / count);
  342. }
  343. finally
  344. {
  345. await e.DisposeAsync();
  346. }
  347. }
  348. }
  349. public static Task<float> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, ValueTask<float>> selector, CancellationToken cancellationToken = default)
  350. {
  351. if (source == null)
  352. throw Error.ArgumentNull(nameof(source));
  353. if (selector == null)
  354. throw Error.ArgumentNull(nameof(selector));
  355. return Core(source, selector, cancellationToken);
  356. static async Task<float> Core(IAsyncEnumerable<TSource> _source, Func<TSource, ValueTask<float>> _selector, CancellationToken _cancellationToken)
  357. {
  358. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  359. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  360. {
  361. if (!await e.MoveNextAsync())
  362. {
  363. throw Error.NoElements();
  364. }
  365. double sum = await _selector(e.Current).ConfigureAwait(false);
  366. long count = 1;
  367. checked
  368. {
  369. while (await e.MoveNextAsync())
  370. {
  371. sum += await _selector(e.Current).ConfigureAwait(false);
  372. ++count;
  373. }
  374. }
  375. return (float)(sum / count);
  376. }
  377. finally
  378. {
  379. await e.DisposeAsync();
  380. }
  381. }
  382. }
  383. #if !NO_DEEP_CANCELLATION
  384. public static Task<float> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, ValueTask<float>> selector, CancellationToken cancellationToken = default)
  385. {
  386. if (source == null)
  387. throw Error.ArgumentNull(nameof(source));
  388. if (selector == null)
  389. throw Error.ArgumentNull(nameof(selector));
  390. return Core(source, selector, cancellationToken);
  391. static async Task<float> Core(IAsyncEnumerable<TSource> _source, Func<TSource, CancellationToken, ValueTask<float>> _selector, CancellationToken _cancellationToken)
  392. {
  393. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  394. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  395. {
  396. if (!await e.MoveNextAsync())
  397. {
  398. throw Error.NoElements();
  399. }
  400. double sum = await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  401. long count = 1;
  402. checked
  403. {
  404. while (await e.MoveNextAsync())
  405. {
  406. sum += await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  407. ++count;
  408. }
  409. }
  410. return (float)(sum / count);
  411. }
  412. finally
  413. {
  414. await e.DisposeAsync();
  415. }
  416. }
  417. }
  418. #endif
  419. public static Task<double> AverageAsync(this IAsyncEnumerable<double> source, CancellationToken cancellationToken = default)
  420. {
  421. if (source == null)
  422. throw Error.ArgumentNull(nameof(source));
  423. return Core(source, cancellationToken);
  424. static async Task<double> Core(IAsyncEnumerable<double> _source, CancellationToken _cancellationToken)
  425. {
  426. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  427. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  428. {
  429. if (!await e.MoveNextAsync())
  430. {
  431. throw Error.NoElements();
  432. }
  433. double sum = e.Current;
  434. long count = 1;
  435. checked
  436. {
  437. while (await e.MoveNextAsync())
  438. {
  439. sum += e.Current;
  440. ++count;
  441. }
  442. }
  443. return sum / count;
  444. }
  445. finally
  446. {
  447. await e.DisposeAsync();
  448. }
  449. }
  450. }
  451. public static Task<double> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, double> selector, CancellationToken cancellationToken = default)
  452. {
  453. if (source == null)
  454. throw Error.ArgumentNull(nameof(source));
  455. if (selector == null)
  456. throw Error.ArgumentNull(nameof(selector));
  457. return Core(source, selector, cancellationToken);
  458. static async Task<double> Core(IAsyncEnumerable<TSource> _source, Func<TSource, double> _selector, CancellationToken _cancellationToken)
  459. {
  460. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  461. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  462. {
  463. if (!await e.MoveNextAsync())
  464. {
  465. throw Error.NoElements();
  466. }
  467. double sum = _selector(e.Current);
  468. long count = 1;
  469. checked
  470. {
  471. while (await e.MoveNextAsync())
  472. {
  473. sum += _selector(e.Current);
  474. ++count;
  475. }
  476. }
  477. return sum / count;
  478. }
  479. finally
  480. {
  481. await e.DisposeAsync();
  482. }
  483. }
  484. }
  485. public static Task<double> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, ValueTask<double>> selector, CancellationToken cancellationToken = default)
  486. {
  487. if (source == null)
  488. throw Error.ArgumentNull(nameof(source));
  489. if (selector == null)
  490. throw Error.ArgumentNull(nameof(selector));
  491. return Core(source, selector, cancellationToken);
  492. static async Task<double> Core(IAsyncEnumerable<TSource> _source, Func<TSource, ValueTask<double>> _selector, CancellationToken _cancellationToken)
  493. {
  494. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  495. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  496. {
  497. if (!await e.MoveNextAsync())
  498. {
  499. throw Error.NoElements();
  500. }
  501. double sum = await _selector(e.Current).ConfigureAwait(false);
  502. long count = 1;
  503. checked
  504. {
  505. while (await e.MoveNextAsync())
  506. {
  507. sum += await _selector(e.Current).ConfigureAwait(false);
  508. ++count;
  509. }
  510. }
  511. return sum / count;
  512. }
  513. finally
  514. {
  515. await e.DisposeAsync();
  516. }
  517. }
  518. }
  519. #if !NO_DEEP_CANCELLATION
  520. public static Task<double> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, ValueTask<double>> selector, CancellationToken cancellationToken = default)
  521. {
  522. if (source == null)
  523. throw Error.ArgumentNull(nameof(source));
  524. if (selector == null)
  525. throw Error.ArgumentNull(nameof(selector));
  526. return Core(source, selector, cancellationToken);
  527. static async Task<double> Core(IAsyncEnumerable<TSource> _source, Func<TSource, CancellationToken, ValueTask<double>> _selector, CancellationToken _cancellationToken)
  528. {
  529. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  530. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  531. {
  532. if (!await e.MoveNextAsync())
  533. {
  534. throw Error.NoElements();
  535. }
  536. double sum = await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  537. long count = 1;
  538. checked
  539. {
  540. while (await e.MoveNextAsync())
  541. {
  542. sum += await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  543. ++count;
  544. }
  545. }
  546. return sum / count;
  547. }
  548. finally
  549. {
  550. await e.DisposeAsync();
  551. }
  552. }
  553. }
  554. #endif
  555. public static Task<decimal> AverageAsync(this IAsyncEnumerable<decimal> source, CancellationToken cancellationToken = default)
  556. {
  557. if (source == null)
  558. throw Error.ArgumentNull(nameof(source));
  559. return Core(source, cancellationToken);
  560. static async Task<decimal> Core(IAsyncEnumerable<decimal> _source, CancellationToken _cancellationToken)
  561. {
  562. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  563. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  564. {
  565. if (!await e.MoveNextAsync())
  566. {
  567. throw Error.NoElements();
  568. }
  569. decimal sum = e.Current;
  570. long count = 1;
  571. checked
  572. {
  573. while (await e.MoveNextAsync())
  574. {
  575. sum += e.Current;
  576. ++count;
  577. }
  578. }
  579. return sum / count;
  580. }
  581. finally
  582. {
  583. await e.DisposeAsync();
  584. }
  585. }
  586. }
  587. public static Task<decimal> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, decimal> selector, CancellationToken cancellationToken = default)
  588. {
  589. if (source == null)
  590. throw Error.ArgumentNull(nameof(source));
  591. if (selector == null)
  592. throw Error.ArgumentNull(nameof(selector));
  593. return Core(source, selector, cancellationToken);
  594. static async Task<decimal> Core(IAsyncEnumerable<TSource> _source, Func<TSource, decimal> _selector, CancellationToken _cancellationToken)
  595. {
  596. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  597. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  598. {
  599. if (!await e.MoveNextAsync())
  600. {
  601. throw Error.NoElements();
  602. }
  603. decimal sum = _selector(e.Current);
  604. long count = 1;
  605. checked
  606. {
  607. while (await e.MoveNextAsync())
  608. {
  609. sum += _selector(e.Current);
  610. ++count;
  611. }
  612. }
  613. return sum / count;
  614. }
  615. finally
  616. {
  617. await e.DisposeAsync();
  618. }
  619. }
  620. }
  621. public static Task<decimal> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, ValueTask<decimal>> selector, CancellationToken cancellationToken = default)
  622. {
  623. if (source == null)
  624. throw Error.ArgumentNull(nameof(source));
  625. if (selector == null)
  626. throw Error.ArgumentNull(nameof(selector));
  627. return Core(source, selector, cancellationToken);
  628. static async Task<decimal> Core(IAsyncEnumerable<TSource> _source, Func<TSource, ValueTask<decimal>> _selector, CancellationToken _cancellationToken)
  629. {
  630. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  631. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  632. {
  633. if (!await e.MoveNextAsync())
  634. {
  635. throw Error.NoElements();
  636. }
  637. decimal sum = await _selector(e.Current).ConfigureAwait(false);
  638. long count = 1;
  639. checked
  640. {
  641. while (await e.MoveNextAsync())
  642. {
  643. sum += await _selector(e.Current).ConfigureAwait(false);
  644. ++count;
  645. }
  646. }
  647. return sum / count;
  648. }
  649. finally
  650. {
  651. await e.DisposeAsync();
  652. }
  653. }
  654. }
  655. #if !NO_DEEP_CANCELLATION
  656. public static Task<decimal> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, ValueTask<decimal>> selector, CancellationToken cancellationToken = default)
  657. {
  658. if (source == null)
  659. throw Error.ArgumentNull(nameof(source));
  660. if (selector == null)
  661. throw Error.ArgumentNull(nameof(selector));
  662. return Core(source, selector, cancellationToken);
  663. static async Task<decimal> Core(IAsyncEnumerable<TSource> _source, Func<TSource, CancellationToken, ValueTask<decimal>> _selector, CancellationToken _cancellationToken)
  664. {
  665. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  666. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  667. {
  668. if (!await e.MoveNextAsync())
  669. {
  670. throw Error.NoElements();
  671. }
  672. decimal sum = await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  673. long count = 1;
  674. checked
  675. {
  676. while (await e.MoveNextAsync())
  677. {
  678. sum += await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  679. ++count;
  680. }
  681. }
  682. return sum / count;
  683. }
  684. finally
  685. {
  686. await e.DisposeAsync();
  687. }
  688. }
  689. }
  690. #endif
  691. public static Task<double?> AverageAsync(this IAsyncEnumerable<int?> source, CancellationToken cancellationToken = default)
  692. {
  693. if (source == null)
  694. throw Error.ArgumentNull(nameof(source));
  695. return Core(source, cancellationToken);
  696. static async Task<double?> Core(IAsyncEnumerable<int?> _source, CancellationToken _cancellationToken)
  697. {
  698. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  699. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  700. {
  701. while (await e.MoveNextAsync())
  702. {
  703. var v = e.Current;
  704. if (v.HasValue)
  705. {
  706. long sum = v.GetValueOrDefault();
  707. long count = 1;
  708. checked
  709. {
  710. while (await e.MoveNextAsync())
  711. {
  712. v = e.Current;
  713. if (v.HasValue)
  714. {
  715. sum += v.GetValueOrDefault();
  716. ++count;
  717. }
  718. }
  719. }
  720. return (double)sum / count;
  721. }
  722. }
  723. }
  724. finally
  725. {
  726. await e.DisposeAsync();
  727. }
  728. return null;
  729. }
  730. }
  731. public static Task<double?> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, int?> selector, CancellationToken cancellationToken = default)
  732. {
  733. if (source == null)
  734. throw Error.ArgumentNull(nameof(source));
  735. if (selector == null)
  736. throw Error.ArgumentNull(nameof(selector));
  737. return Core(source, selector, cancellationToken);
  738. static async Task<double?> Core(IAsyncEnumerable<TSource> _source, Func<TSource, int?> _selector, CancellationToken _cancellationToken)
  739. {
  740. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  741. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  742. {
  743. while (await e.MoveNextAsync())
  744. {
  745. var v = _selector(e.Current);
  746. if (v.HasValue)
  747. {
  748. long sum = v.GetValueOrDefault();
  749. long count = 1;
  750. checked
  751. {
  752. while (await e.MoveNextAsync())
  753. {
  754. v = _selector(e.Current);
  755. if (v.HasValue)
  756. {
  757. sum += v.GetValueOrDefault();
  758. ++count;
  759. }
  760. }
  761. }
  762. return (double)sum / count;
  763. }
  764. }
  765. }
  766. finally
  767. {
  768. await e.DisposeAsync();
  769. }
  770. return null;
  771. }
  772. }
  773. public static Task<double?> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, ValueTask<int?>> selector, CancellationToken cancellationToken = default)
  774. {
  775. if (source == null)
  776. throw Error.ArgumentNull(nameof(source));
  777. if (selector == null)
  778. throw Error.ArgumentNull(nameof(selector));
  779. return Core(source, selector, cancellationToken);
  780. static async Task<double?> Core(IAsyncEnumerable<TSource> _source, Func<TSource, ValueTask<int?>> _selector, CancellationToken _cancellationToken)
  781. {
  782. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  783. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  784. {
  785. while (await e.MoveNextAsync())
  786. {
  787. var v = await _selector(e.Current).ConfigureAwait(false);
  788. if (v.HasValue)
  789. {
  790. long sum = v.GetValueOrDefault();
  791. long count = 1;
  792. checked
  793. {
  794. while (await e.MoveNextAsync())
  795. {
  796. v = await _selector(e.Current).ConfigureAwait(false);
  797. if (v.HasValue)
  798. {
  799. sum += v.GetValueOrDefault();
  800. ++count;
  801. }
  802. }
  803. }
  804. return (double)sum / count;
  805. }
  806. }
  807. }
  808. finally
  809. {
  810. await e.DisposeAsync();
  811. }
  812. return null;
  813. }
  814. }
  815. #if !NO_DEEP_CANCELLATION
  816. public static Task<double?> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, ValueTask<int?>> selector, CancellationToken cancellationToken = default)
  817. {
  818. if (source == null)
  819. throw Error.ArgumentNull(nameof(source));
  820. if (selector == null)
  821. throw Error.ArgumentNull(nameof(selector));
  822. return Core(source, selector, cancellationToken);
  823. static async Task<double?> Core(IAsyncEnumerable<TSource> _source, Func<TSource, CancellationToken, ValueTask<int?>> _selector, CancellationToken _cancellationToken)
  824. {
  825. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  826. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  827. {
  828. while (await e.MoveNextAsync())
  829. {
  830. var v = await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  831. if (v.HasValue)
  832. {
  833. long sum = v.GetValueOrDefault();
  834. long count = 1;
  835. checked
  836. {
  837. while (await e.MoveNextAsync())
  838. {
  839. v = await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  840. if (v.HasValue)
  841. {
  842. sum += v.GetValueOrDefault();
  843. ++count;
  844. }
  845. }
  846. }
  847. return (double)sum / count;
  848. }
  849. }
  850. }
  851. finally
  852. {
  853. await e.DisposeAsync();
  854. }
  855. return null;
  856. }
  857. }
  858. #endif
  859. public static Task<double?> AverageAsync(this IAsyncEnumerable<long?> source, CancellationToken cancellationToken = default)
  860. {
  861. if (source == null)
  862. throw Error.ArgumentNull(nameof(source));
  863. return Core(source, cancellationToken);
  864. static async Task<double?> Core(IAsyncEnumerable<long?> _source, CancellationToken _cancellationToken)
  865. {
  866. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  867. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  868. {
  869. while (await e.MoveNextAsync())
  870. {
  871. var v = e.Current;
  872. if (v.HasValue)
  873. {
  874. long sum = v.GetValueOrDefault();
  875. long count = 1;
  876. checked
  877. {
  878. while (await e.MoveNextAsync())
  879. {
  880. v = e.Current;
  881. if (v.HasValue)
  882. {
  883. sum += v.GetValueOrDefault();
  884. ++count;
  885. }
  886. }
  887. }
  888. return (double)sum / count;
  889. }
  890. }
  891. }
  892. finally
  893. {
  894. await e.DisposeAsync();
  895. }
  896. return null;
  897. }
  898. }
  899. public static Task<double?> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, long?> selector, CancellationToken cancellationToken = default)
  900. {
  901. if (source == null)
  902. throw Error.ArgumentNull(nameof(source));
  903. if (selector == null)
  904. throw Error.ArgumentNull(nameof(selector));
  905. return Core(source, selector, cancellationToken);
  906. static async Task<double?> Core(IAsyncEnumerable<TSource> _source, Func<TSource, long?> _selector, CancellationToken _cancellationToken)
  907. {
  908. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  909. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  910. {
  911. while (await e.MoveNextAsync())
  912. {
  913. var v = _selector(e.Current);
  914. if (v.HasValue)
  915. {
  916. long sum = v.GetValueOrDefault();
  917. long count = 1;
  918. checked
  919. {
  920. while (await e.MoveNextAsync())
  921. {
  922. v = _selector(e.Current);
  923. if (v.HasValue)
  924. {
  925. sum += v.GetValueOrDefault();
  926. ++count;
  927. }
  928. }
  929. }
  930. return (double)sum / count;
  931. }
  932. }
  933. }
  934. finally
  935. {
  936. await e.DisposeAsync();
  937. }
  938. return null;
  939. }
  940. }
  941. public static Task<double?> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, ValueTask<long?>> selector, CancellationToken cancellationToken = default)
  942. {
  943. if (source == null)
  944. throw Error.ArgumentNull(nameof(source));
  945. if (selector == null)
  946. throw Error.ArgumentNull(nameof(selector));
  947. return Core(source, selector, cancellationToken);
  948. static async Task<double?> Core(IAsyncEnumerable<TSource> _source, Func<TSource, ValueTask<long?>> _selector, CancellationToken _cancellationToken)
  949. {
  950. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  951. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  952. {
  953. while (await e.MoveNextAsync())
  954. {
  955. var v = await _selector(e.Current).ConfigureAwait(false);
  956. if (v.HasValue)
  957. {
  958. long sum = v.GetValueOrDefault();
  959. long count = 1;
  960. checked
  961. {
  962. while (await e.MoveNextAsync())
  963. {
  964. v = await _selector(e.Current).ConfigureAwait(false);
  965. if (v.HasValue)
  966. {
  967. sum += v.GetValueOrDefault();
  968. ++count;
  969. }
  970. }
  971. }
  972. return (double)sum / count;
  973. }
  974. }
  975. }
  976. finally
  977. {
  978. await e.DisposeAsync();
  979. }
  980. return null;
  981. }
  982. }
  983. #if !NO_DEEP_CANCELLATION
  984. public static Task<double?> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, ValueTask<long?>> selector, CancellationToken cancellationToken = default)
  985. {
  986. if (source == null)
  987. throw Error.ArgumentNull(nameof(source));
  988. if (selector == null)
  989. throw Error.ArgumentNull(nameof(selector));
  990. return Core(source, selector, cancellationToken);
  991. static async Task<double?> Core(IAsyncEnumerable<TSource> _source, Func<TSource, CancellationToken, ValueTask<long?>> _selector, CancellationToken _cancellationToken)
  992. {
  993. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  994. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  995. {
  996. while (await e.MoveNextAsync())
  997. {
  998. var v = await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  999. if (v.HasValue)
  1000. {
  1001. long sum = v.GetValueOrDefault();
  1002. long count = 1;
  1003. checked
  1004. {
  1005. while (await e.MoveNextAsync())
  1006. {
  1007. v = await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  1008. if (v.HasValue)
  1009. {
  1010. sum += v.GetValueOrDefault();
  1011. ++count;
  1012. }
  1013. }
  1014. }
  1015. return (double)sum / count;
  1016. }
  1017. }
  1018. }
  1019. finally
  1020. {
  1021. await e.DisposeAsync();
  1022. }
  1023. return null;
  1024. }
  1025. }
  1026. #endif
  1027. public static Task<float?> AverageAsync(this IAsyncEnumerable<float?> source, CancellationToken cancellationToken = default)
  1028. {
  1029. if (source == null)
  1030. throw Error.ArgumentNull(nameof(source));
  1031. return Core(source, cancellationToken);
  1032. static async Task<float?> Core(IAsyncEnumerable<float?> _source, CancellationToken _cancellationToken)
  1033. {
  1034. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  1035. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  1036. {
  1037. while (await e.MoveNextAsync())
  1038. {
  1039. var v = e.Current;
  1040. if (v.HasValue)
  1041. {
  1042. double sum = v.GetValueOrDefault();
  1043. long count = 1;
  1044. checked
  1045. {
  1046. while (await e.MoveNextAsync())
  1047. {
  1048. v = e.Current;
  1049. if (v.HasValue)
  1050. {
  1051. sum += v.GetValueOrDefault();
  1052. ++count;
  1053. }
  1054. }
  1055. }
  1056. return (float)(sum / count);
  1057. }
  1058. }
  1059. }
  1060. finally
  1061. {
  1062. await e.DisposeAsync();
  1063. }
  1064. return null;
  1065. }
  1066. }
  1067. public static Task<float?> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, float?> selector, CancellationToken cancellationToken = default)
  1068. {
  1069. if (source == null)
  1070. throw Error.ArgumentNull(nameof(source));
  1071. if (selector == null)
  1072. throw Error.ArgumentNull(nameof(selector));
  1073. return Core(source, selector, cancellationToken);
  1074. static async Task<float?> Core(IAsyncEnumerable<TSource> _source, Func<TSource, float?> _selector, CancellationToken _cancellationToken)
  1075. {
  1076. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  1077. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  1078. {
  1079. while (await e.MoveNextAsync())
  1080. {
  1081. var v = _selector(e.Current);
  1082. if (v.HasValue)
  1083. {
  1084. double sum = v.GetValueOrDefault();
  1085. long count = 1;
  1086. checked
  1087. {
  1088. while (await e.MoveNextAsync())
  1089. {
  1090. v = _selector(e.Current);
  1091. if (v.HasValue)
  1092. {
  1093. sum += v.GetValueOrDefault();
  1094. ++count;
  1095. }
  1096. }
  1097. }
  1098. return (float)(sum / count);
  1099. }
  1100. }
  1101. }
  1102. finally
  1103. {
  1104. await e.DisposeAsync();
  1105. }
  1106. return null;
  1107. }
  1108. }
  1109. public static Task<float?> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, ValueTask<float?>> selector, CancellationToken cancellationToken = default)
  1110. {
  1111. if (source == null)
  1112. throw Error.ArgumentNull(nameof(source));
  1113. if (selector == null)
  1114. throw Error.ArgumentNull(nameof(selector));
  1115. return Core(source, selector, cancellationToken);
  1116. static async Task<float?> Core(IAsyncEnumerable<TSource> _source, Func<TSource, ValueTask<float?>> _selector, CancellationToken _cancellationToken)
  1117. {
  1118. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  1119. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  1120. {
  1121. while (await e.MoveNextAsync())
  1122. {
  1123. var v = await _selector(e.Current).ConfigureAwait(false);
  1124. if (v.HasValue)
  1125. {
  1126. double sum = v.GetValueOrDefault();
  1127. long count = 1;
  1128. checked
  1129. {
  1130. while (await e.MoveNextAsync())
  1131. {
  1132. v = await _selector(e.Current).ConfigureAwait(false);
  1133. if (v.HasValue)
  1134. {
  1135. sum += v.GetValueOrDefault();
  1136. ++count;
  1137. }
  1138. }
  1139. }
  1140. return (float)(sum / count);
  1141. }
  1142. }
  1143. }
  1144. finally
  1145. {
  1146. await e.DisposeAsync();
  1147. }
  1148. return null;
  1149. }
  1150. }
  1151. #if !NO_DEEP_CANCELLATION
  1152. public static Task<float?> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, ValueTask<float?>> selector, CancellationToken cancellationToken = default)
  1153. {
  1154. if (source == null)
  1155. throw Error.ArgumentNull(nameof(source));
  1156. if (selector == null)
  1157. throw Error.ArgumentNull(nameof(selector));
  1158. return Core(source, selector, cancellationToken);
  1159. static async Task<float?> Core(IAsyncEnumerable<TSource> _source, Func<TSource, CancellationToken, ValueTask<float?>> _selector, CancellationToken _cancellationToken)
  1160. {
  1161. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  1162. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  1163. {
  1164. while (await e.MoveNextAsync())
  1165. {
  1166. var v = await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  1167. if (v.HasValue)
  1168. {
  1169. double sum = v.GetValueOrDefault();
  1170. long count = 1;
  1171. checked
  1172. {
  1173. while (await e.MoveNextAsync())
  1174. {
  1175. v = await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  1176. if (v.HasValue)
  1177. {
  1178. sum += v.GetValueOrDefault();
  1179. ++count;
  1180. }
  1181. }
  1182. }
  1183. return (float)(sum / count);
  1184. }
  1185. }
  1186. }
  1187. finally
  1188. {
  1189. await e.DisposeAsync();
  1190. }
  1191. return null;
  1192. }
  1193. }
  1194. #endif
  1195. public static Task<double?> AverageAsync(this IAsyncEnumerable<double?> source, CancellationToken cancellationToken = default)
  1196. {
  1197. if (source == null)
  1198. throw Error.ArgumentNull(nameof(source));
  1199. return Core(source, cancellationToken);
  1200. static async Task<double?> Core(IAsyncEnumerable<double?> _source, CancellationToken _cancellationToken)
  1201. {
  1202. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  1203. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  1204. {
  1205. while (await e.MoveNextAsync())
  1206. {
  1207. var v = e.Current;
  1208. if (v.HasValue)
  1209. {
  1210. double sum = v.GetValueOrDefault();
  1211. long count = 1;
  1212. checked
  1213. {
  1214. while (await e.MoveNextAsync())
  1215. {
  1216. v = e.Current;
  1217. if (v.HasValue)
  1218. {
  1219. sum += v.GetValueOrDefault();
  1220. ++count;
  1221. }
  1222. }
  1223. }
  1224. return sum / count;
  1225. }
  1226. }
  1227. }
  1228. finally
  1229. {
  1230. await e.DisposeAsync();
  1231. }
  1232. return null;
  1233. }
  1234. }
  1235. public static Task<double?> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, double?> selector, CancellationToken cancellationToken = default)
  1236. {
  1237. if (source == null)
  1238. throw Error.ArgumentNull(nameof(source));
  1239. if (selector == null)
  1240. throw Error.ArgumentNull(nameof(selector));
  1241. return Core(source, selector, cancellationToken);
  1242. static async Task<double?> Core(IAsyncEnumerable<TSource> _source, Func<TSource, double?> _selector, CancellationToken _cancellationToken)
  1243. {
  1244. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  1245. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  1246. {
  1247. while (await e.MoveNextAsync())
  1248. {
  1249. var v = _selector(e.Current);
  1250. if (v.HasValue)
  1251. {
  1252. double sum = v.GetValueOrDefault();
  1253. long count = 1;
  1254. checked
  1255. {
  1256. while (await e.MoveNextAsync())
  1257. {
  1258. v = _selector(e.Current);
  1259. if (v.HasValue)
  1260. {
  1261. sum += v.GetValueOrDefault();
  1262. ++count;
  1263. }
  1264. }
  1265. }
  1266. return sum / count;
  1267. }
  1268. }
  1269. }
  1270. finally
  1271. {
  1272. await e.DisposeAsync();
  1273. }
  1274. return null;
  1275. }
  1276. }
  1277. public static Task<double?> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, ValueTask<double?>> selector, CancellationToken cancellationToken = default)
  1278. {
  1279. if (source == null)
  1280. throw Error.ArgumentNull(nameof(source));
  1281. if (selector == null)
  1282. throw Error.ArgumentNull(nameof(selector));
  1283. return Core(source, selector, cancellationToken);
  1284. static async Task<double?> Core(IAsyncEnumerable<TSource> _source, Func<TSource, ValueTask<double?>> _selector, CancellationToken _cancellationToken)
  1285. {
  1286. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  1287. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  1288. {
  1289. while (await e.MoveNextAsync())
  1290. {
  1291. var v = await _selector(e.Current).ConfigureAwait(false);
  1292. if (v.HasValue)
  1293. {
  1294. double sum = v.GetValueOrDefault();
  1295. long count = 1;
  1296. checked
  1297. {
  1298. while (await e.MoveNextAsync())
  1299. {
  1300. v = await _selector(e.Current).ConfigureAwait(false);
  1301. if (v.HasValue)
  1302. {
  1303. sum += v.GetValueOrDefault();
  1304. ++count;
  1305. }
  1306. }
  1307. }
  1308. return sum / count;
  1309. }
  1310. }
  1311. }
  1312. finally
  1313. {
  1314. await e.DisposeAsync();
  1315. }
  1316. return null;
  1317. }
  1318. }
  1319. #if !NO_DEEP_CANCELLATION
  1320. public static Task<double?> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, ValueTask<double?>> selector, CancellationToken cancellationToken = default)
  1321. {
  1322. if (source == null)
  1323. throw Error.ArgumentNull(nameof(source));
  1324. if (selector == null)
  1325. throw Error.ArgumentNull(nameof(selector));
  1326. return Core(source, selector, cancellationToken);
  1327. static async Task<double?> Core(IAsyncEnumerable<TSource> _source, Func<TSource, CancellationToken, ValueTask<double?>> _selector, CancellationToken _cancellationToken)
  1328. {
  1329. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  1330. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  1331. {
  1332. while (await e.MoveNextAsync())
  1333. {
  1334. var v = await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  1335. if (v.HasValue)
  1336. {
  1337. double sum = v.GetValueOrDefault();
  1338. long count = 1;
  1339. checked
  1340. {
  1341. while (await e.MoveNextAsync())
  1342. {
  1343. v = await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  1344. if (v.HasValue)
  1345. {
  1346. sum += v.GetValueOrDefault();
  1347. ++count;
  1348. }
  1349. }
  1350. }
  1351. return sum / count;
  1352. }
  1353. }
  1354. }
  1355. finally
  1356. {
  1357. await e.DisposeAsync();
  1358. }
  1359. return null;
  1360. }
  1361. }
  1362. #endif
  1363. public static Task<decimal?> AverageAsync(this IAsyncEnumerable<decimal?> source, CancellationToken cancellationToken = default)
  1364. {
  1365. if (source == null)
  1366. throw Error.ArgumentNull(nameof(source));
  1367. return Core(source, cancellationToken);
  1368. static async Task<decimal?> Core(IAsyncEnumerable<decimal?> _source, CancellationToken _cancellationToken)
  1369. {
  1370. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  1371. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  1372. {
  1373. while (await e.MoveNextAsync())
  1374. {
  1375. var v = e.Current;
  1376. if (v.HasValue)
  1377. {
  1378. decimal sum = v.GetValueOrDefault();
  1379. long count = 1;
  1380. checked
  1381. {
  1382. while (await e.MoveNextAsync())
  1383. {
  1384. v = e.Current;
  1385. if (v.HasValue)
  1386. {
  1387. sum += v.GetValueOrDefault();
  1388. ++count;
  1389. }
  1390. }
  1391. }
  1392. return sum / count;
  1393. }
  1394. }
  1395. }
  1396. finally
  1397. {
  1398. await e.DisposeAsync();
  1399. }
  1400. return null;
  1401. }
  1402. }
  1403. public static Task<decimal?> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, decimal?> selector, CancellationToken cancellationToken = default)
  1404. {
  1405. if (source == null)
  1406. throw Error.ArgumentNull(nameof(source));
  1407. if (selector == null)
  1408. throw Error.ArgumentNull(nameof(selector));
  1409. return Core(source, selector, cancellationToken);
  1410. static async Task<decimal?> Core(IAsyncEnumerable<TSource> _source, Func<TSource, decimal?> _selector, CancellationToken _cancellationToken)
  1411. {
  1412. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  1413. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  1414. {
  1415. while (await e.MoveNextAsync())
  1416. {
  1417. var v = _selector(e.Current);
  1418. if (v.HasValue)
  1419. {
  1420. decimal sum = v.GetValueOrDefault();
  1421. long count = 1;
  1422. checked
  1423. {
  1424. while (await e.MoveNextAsync())
  1425. {
  1426. v = _selector(e.Current);
  1427. if (v.HasValue)
  1428. {
  1429. sum += v.GetValueOrDefault();
  1430. ++count;
  1431. }
  1432. }
  1433. }
  1434. return sum / count;
  1435. }
  1436. }
  1437. }
  1438. finally
  1439. {
  1440. await e.DisposeAsync();
  1441. }
  1442. return null;
  1443. }
  1444. }
  1445. public static Task<decimal?> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, ValueTask<decimal?>> selector, CancellationToken cancellationToken = default)
  1446. {
  1447. if (source == null)
  1448. throw Error.ArgumentNull(nameof(source));
  1449. if (selector == null)
  1450. throw Error.ArgumentNull(nameof(selector));
  1451. return Core(source, selector, cancellationToken);
  1452. static async Task<decimal?> Core(IAsyncEnumerable<TSource> _source, Func<TSource, ValueTask<decimal?>> _selector, CancellationToken _cancellationToken)
  1453. {
  1454. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  1455. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  1456. {
  1457. while (await e.MoveNextAsync())
  1458. {
  1459. var v = await _selector(e.Current).ConfigureAwait(false);
  1460. if (v.HasValue)
  1461. {
  1462. decimal sum = v.GetValueOrDefault();
  1463. long count = 1;
  1464. checked
  1465. {
  1466. while (await e.MoveNextAsync())
  1467. {
  1468. v = await _selector(e.Current).ConfigureAwait(false);
  1469. if (v.HasValue)
  1470. {
  1471. sum += v.GetValueOrDefault();
  1472. ++count;
  1473. }
  1474. }
  1475. }
  1476. return sum / count;
  1477. }
  1478. }
  1479. }
  1480. finally
  1481. {
  1482. await e.DisposeAsync();
  1483. }
  1484. return null;
  1485. }
  1486. }
  1487. #if !NO_DEEP_CANCELLATION
  1488. public static Task<decimal?> AverageAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, ValueTask<decimal?>> selector, CancellationToken cancellationToken = default)
  1489. {
  1490. if (source == null)
  1491. throw Error.ArgumentNull(nameof(source));
  1492. if (selector == null)
  1493. throw Error.ArgumentNull(nameof(selector));
  1494. return Core(source, selector, cancellationToken);
  1495. static async Task<decimal?> Core(IAsyncEnumerable<TSource> _source, Func<TSource, CancellationToken, ValueTask<decimal?>> _selector, CancellationToken _cancellationToken)
  1496. {
  1497. var e = _source.GetConfiguredAsyncEnumerator(_cancellationToken, false);
  1498. try // REVIEW: Can use `await using` if we get pattern bind (HAS_AWAIT_USING_PATTERN_BIND)
  1499. {
  1500. while (await e.MoveNextAsync())
  1501. {
  1502. var v = await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  1503. if (v.HasValue)
  1504. {
  1505. decimal sum = v.GetValueOrDefault();
  1506. long count = 1;
  1507. checked
  1508. {
  1509. while (await e.MoveNextAsync())
  1510. {
  1511. v = await _selector(e.Current, _cancellationToken).ConfigureAwait(false);
  1512. if (v.HasValue)
  1513. {
  1514. sum += v.GetValueOrDefault();
  1515. ++count;
  1516. }
  1517. }
  1518. }
  1519. return sum / count;
  1520. }
  1521. }
  1522. }
  1523. finally
  1524. {
  1525. await e.DisposeAsync();
  1526. }
  1527. return null;
  1528. }
  1529. }
  1530. #endif
  1531. }
  1532. }