Program.cs 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT License.
  3. // See the LICENSE file in the project root for more information.
  4. #nullable disable
  5. #pragma warning disable CS0436 // Interface definitions conflict with .NET Runtime. This brings its own older definitions of various async interfaces.
  6. using System;
  7. using System.Collections;
  8. using System.Collections.Generic;
  9. using System.Diagnostics;
  10. using System.Labs.Linq;
  11. using System.Threading.Tasks;
  12. namespace FasterLinq
  13. {
  14. class Program
  15. {
  16. static void Main()
  17. {
  18. var N = 4;
  19. Sync(N);
  20. Async1(N).Wait();
  21. Async2(N).Wait();
  22. }
  23. static void Sync(int n)
  24. {
  25. Console.WriteLine("IEnumerable<T> and IFastEnumerable<T>");
  26. Console.WriteLine();
  27. var sw = new Stopwatch();
  28. var N = 10_000_000;
  29. var next = new Action<int>(_ => { });
  30. var slowRange = Enumerable.Range(0, N);
  31. var fastRange = FastEnumerable.Range(0, N);
  32. var brdgRange = slowRange.ToFastEnumerable();
  33. var slow = slowRange.Where(x => x % 2 == 0).Select(x => x + 1);
  34. var fast = fastRange.Where(x => x % 2 == 0).Select(x => x + 1);
  35. var brdg = brdgRange.Where(x => x % 2 == 0).Select(x => x + 1).ToEnumerable();
  36. Console.WriteLine("slow.Sum() = " + slow.Aggregate(0, (sum, x) => sum + x));
  37. Console.WriteLine("fast.Sum() = " + fast.Aggregate(0, (sum, x) => sum + x));
  38. Console.WriteLine("brdg.Sum() = " + brdg.Aggregate(0, (sum, x) => sum + x));
  39. Console.WriteLine();
  40. for (var i = 0; i < n; i++)
  41. {
  42. sw.Restart();
  43. {
  44. slow.ForEach(next);
  45. }
  46. Console.WriteLine("SLOW " + sw.Elapsed);
  47. sw.Restart();
  48. {
  49. fast.ForEach(next);
  50. }
  51. Console.WriteLine("FAST " + sw.Elapsed);
  52. sw.Restart();
  53. {
  54. brdg.ForEach(next);
  55. }
  56. Console.WriteLine("BRDG " + sw.Elapsed);
  57. Console.WriteLine();
  58. }
  59. Console.WriteLine();
  60. }
  61. static async Task Async1(int n)
  62. {
  63. Console.WriteLine("IAsyncEnumerable<T> and IAsyncFastEnumerable<T> - Synchronous query operators");
  64. Console.WriteLine();
  65. var sw = new Stopwatch();
  66. var N = 10_000_000;
  67. var next = new Func<int, Task>(_ => Task.CompletedTask);
  68. var slowRange = AsyncEnumerable.Range(0, N);
  69. var fastRange = AsyncFastEnumerable.Range(0, N);
  70. var brdgRange = slowRange.ToAsyncFastEnumerable();
  71. var slow = slowRange.Where(x => x % 2 == 0).Select(x => x + 1);
  72. var fast = fastRange.Where(x => x % 2 == 0).Select(x => x + 1);
  73. var brdg = brdgRange.Where(x => x % 2 == 0).Select(x => x + 1).ToAsyncEnumerable();
  74. Console.WriteLine("slow.Sum() = " + slow.Aggregate(0, (sum, x) => sum + x).Result);
  75. Console.WriteLine("fast.Sum() = " + fast.Aggregate(0, (sum, x) => sum + x).Result);
  76. Console.WriteLine("brdg.Sum() = " + brdg.Aggregate(0, (sum, x) => sum + x).Result);
  77. Console.WriteLine();
  78. for (var i = 0; i < n; i++)
  79. {
  80. sw.Restart();
  81. {
  82. await slow.ForEachAsync(next);
  83. }
  84. Console.WriteLine("SLOW " + sw.Elapsed);
  85. sw.Restart();
  86. {
  87. await fast.ForEachAsync(next);
  88. }
  89. Console.WriteLine("FAST " + sw.Elapsed);
  90. sw.Restart();
  91. {
  92. await brdg.ForEachAsync(next);
  93. }
  94. Console.WriteLine("BRDG " + sw.Elapsed);
  95. Console.WriteLine();
  96. }
  97. Console.WriteLine();
  98. }
  99. static async Task Async2(int n)
  100. {
  101. Console.WriteLine("IAsyncEnumerable<T> and IAsyncFastEnumerable<T> - Asynchronous query operators");
  102. Console.WriteLine();
  103. var sw = new Stopwatch();
  104. var N = 10_000_000;
  105. var next = new Func<int, Task>(_ => Task.CompletedTask);
  106. var slowRange = AsyncEnumerable.Range(0, N);
  107. var fastRange = AsyncFastEnumerable.Range(0, N);
  108. var brdgRange = slowRange.ToAsyncFastEnumerable();
  109. var slow = slowRange.Where(x => Task.FromResult(x % 2 == 0)).Select(x => Task.FromResult(x + 1));
  110. var fast = fastRange.Where(x => Task.FromResult(x % 2 == 0)).Select(x => Task.FromResult(x + 1));
  111. var brdg = brdgRange.Where(x => Task.FromResult(x % 2 == 0)).Select(x => Task.FromResult(x + 1)).ToAsyncEnumerable();
  112. Console.WriteLine("slow.Sum() = " + slow.Aggregate(0, (sum, x) => sum + x).Result);
  113. Console.WriteLine("fast.Sum() = " + fast.Aggregate(0, (sum, x) => sum + x).Result);
  114. Console.WriteLine("brdg.Sum() = " + brdg.Aggregate(0, (sum, x) => sum + x).Result);
  115. Console.WriteLine();
  116. for (var i = 0; i < n; i++)
  117. {
  118. sw.Restart();
  119. {
  120. await slow.ForEachAsync(next);
  121. }
  122. Console.WriteLine("SLOW " + sw.Elapsed);
  123. sw.Restart();
  124. {
  125. await fast.ForEachAsync(next);
  126. }
  127. Console.WriteLine("FAST " + sw.Elapsed);
  128. sw.Restart();
  129. {
  130. await brdg.ForEachAsync(next);
  131. }
  132. Console.WriteLine("BRDG " + sw.Elapsed);
  133. Console.WriteLine();
  134. }
  135. Console.WriteLine();
  136. }
  137. }
  138. }
  139. namespace System
  140. {
  141. public interface IAsyncDisposable
  142. {
  143. Task DisposeAsync();
  144. }
  145. }
  146. namespace System.Collections.Generic
  147. {
  148. public interface IAsyncEnumerable<out T>
  149. {
  150. IAsyncEnumerator<T> GetAsyncEnumerator();
  151. }
  152. public interface IAsyncEnumerator<out T> : IAsyncDisposable
  153. {
  154. Task<bool> MoveNextAsync();
  155. T Current { get; }
  156. }
  157. public interface IFastEnumerable<out T>
  158. {
  159. IFastEnumerator<T> GetEnumerator();
  160. }
  161. public interface IFastEnumerator<out T> : IDisposable
  162. {
  163. T TryGetNext(out bool success);
  164. }
  165. public interface IAsyncFastEnumerable<out T>
  166. {
  167. IAsyncFastEnumerator<T> GetAsyncEnumerator();
  168. }
  169. public interface IAsyncFastEnumerator<out T> : IAsyncDisposable
  170. {
  171. Task<bool> WaitForNextAsync();
  172. T TryGetNext(out bool success);
  173. }
  174. }
  175. namespace System.Labs.Linq
  176. {
  177. internal abstract class Iterator<T> : IEnumerable<T>, IEnumerator<T>
  178. {
  179. private readonly int _threadId;
  180. internal int _state;
  181. protected T _current;
  182. protected Iterator()
  183. {
  184. _threadId = Environment.CurrentManagedThreadId;
  185. }
  186. public abstract Iterator<T> Clone();
  187. public virtual void Dispose()
  188. {
  189. _state = -1;
  190. }
  191. public IEnumerator<T> GetEnumerator()
  192. {
  193. Iterator<T> enumerator = _state == 0 && _threadId == Environment.CurrentManagedThreadId ? this : Clone();
  194. enumerator._state = 1;
  195. return enumerator;
  196. }
  197. public abstract bool MoveNext();
  198. public T Current => _current;
  199. object IEnumerator.Current => _current;
  200. IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
  201. public void Reset() => throw new NotSupportedException();
  202. }
  203. internal abstract class AsyncIterator<T> : IAsyncEnumerable<T>, IAsyncEnumerator<T>
  204. {
  205. private readonly int _threadId;
  206. internal int _state;
  207. protected T _current;
  208. protected AsyncIterator()
  209. {
  210. _threadId = Environment.CurrentManagedThreadId;
  211. }
  212. public abstract AsyncIterator<T> Clone();
  213. public virtual Task DisposeAsync()
  214. {
  215. _state = -1;
  216. return Task.CompletedTask;
  217. }
  218. public IAsyncEnumerator<T> GetAsyncEnumerator()
  219. {
  220. AsyncIterator<T> enumerator = _state == 0 && _threadId == Environment.CurrentManagedThreadId ? this : Clone();
  221. enumerator._state = 1;
  222. return enumerator;
  223. }
  224. public abstract Task<bool> MoveNextAsync();
  225. public T Current => _current;
  226. }
  227. internal abstract class FastIterator<T> : IFastEnumerable<T>, IFastEnumerator<T>
  228. {
  229. private readonly int _threadId;
  230. internal int _state;
  231. protected FastIterator()
  232. {
  233. _threadId = Environment.CurrentManagedThreadId;
  234. }
  235. public abstract FastIterator<T> Clone();
  236. public virtual void Dispose()
  237. {
  238. _state = -1;
  239. }
  240. public IFastEnumerator<T> GetEnumerator()
  241. {
  242. FastIterator<T> enumerator = _state == 0 && _threadId == Environment.CurrentManagedThreadId ? this : Clone();
  243. enumerator._state = 1;
  244. return enumerator;
  245. }
  246. public abstract T TryGetNext(out bool success);
  247. }
  248. internal abstract class AsyncFastIterator<T> : IAsyncFastEnumerable<T>, IAsyncFastEnumerator<T>
  249. {
  250. private readonly int _threadId;
  251. internal int _state;
  252. protected AsyncFastIterator()
  253. {
  254. _threadId = Environment.CurrentManagedThreadId;
  255. }
  256. public abstract AsyncFastIterator<T> Clone();
  257. public virtual Task DisposeAsync()
  258. {
  259. _state = -1;
  260. return Task.CompletedTask;
  261. }
  262. public IAsyncFastEnumerator<T> GetAsyncEnumerator()
  263. {
  264. AsyncFastIterator<T> enumerator = _state == 0 && _threadId == Environment.CurrentManagedThreadId ? this : Clone();
  265. enumerator._state = 1;
  266. return enumerator;
  267. }
  268. public abstract Task<bool> WaitForNextAsync();
  269. public abstract T TryGetNext(out bool success);
  270. }
  271. public static class Enumerable
  272. {
  273. public static R Aggregate<T, R>(this IEnumerable<T> source, R seed, Func<R, T, R> aggregate)
  274. {
  275. var res = seed;
  276. foreach (var item in source)
  277. {
  278. res = aggregate(res, item);
  279. }
  280. return res;
  281. }
  282. public static IEnumerable<T> Empty<T>() => EmptyIterator<T>.Instance;
  283. public static void ForEach<T>(this IEnumerable<T> source, Action<T> next)
  284. {
  285. foreach (var item in source)
  286. {
  287. next(item);
  288. }
  289. }
  290. public static IEnumerable<int> Range(int start, int count) => new RangeIterator(start, count);
  291. public static IEnumerable<R> Select<T, R>(this IEnumerable<T> source, Func<T, R> selector) => new SelectIterator<T, R>(source, selector);
  292. public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate) => new WhereIterator<T>(source, predicate);
  293. private sealed class EmptyIterator<T> : IEnumerable<T>, IEnumerator<T>
  294. {
  295. public static readonly EmptyIterator<T> Instance = new EmptyIterator<T>();
  296. public T Current => default(T);
  297. object IEnumerator.Current => default(T);
  298. public void Dispose() { }
  299. public IEnumerator<T> GetEnumerator() => this;
  300. public bool MoveNext() => false;
  301. public void Reset() { }
  302. IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
  303. }
  304. private sealed class RangeIterator : Iterator<int>
  305. {
  306. private readonly int _start;
  307. private readonly int _end;
  308. private int _next;
  309. public RangeIterator(int start, int count)
  310. {
  311. _start = start;
  312. _end = start + count;
  313. }
  314. public override Iterator<int> Clone() => new RangeIterator(_start, _end - _start);
  315. public override bool MoveNext()
  316. {
  317. switch (_state)
  318. {
  319. case 1:
  320. _next = _start;
  321. _state = 2;
  322. goto case 2;
  323. case 2:
  324. if (_next < _end)
  325. {
  326. _current = _next++;
  327. return true;
  328. }
  329. break;
  330. }
  331. return false;
  332. }
  333. }
  334. private sealed class SelectIterator<T, R> : Iterator<R>
  335. {
  336. private readonly IEnumerable<T> _source;
  337. private readonly Func<T, R> _selector;
  338. private IEnumerator<T> _enumerator;
  339. public SelectIterator(IEnumerable<T> source, Func<T, R> selector)
  340. {
  341. _source = source;
  342. _selector = selector;
  343. }
  344. public override Iterator<R> Clone() => new SelectIterator<T, R>(_source, _selector);
  345. public override bool MoveNext()
  346. {
  347. switch (_state)
  348. {
  349. case 1:
  350. _enumerator = _source.GetEnumerator();
  351. _state = 2;
  352. goto case 2;
  353. case 2:
  354. if (_enumerator.MoveNext())
  355. {
  356. _current = _selector(_enumerator.Current);
  357. return true;
  358. }
  359. break;
  360. }
  361. return false;
  362. }
  363. public override void Dispose() => _enumerator?.Dispose();
  364. }
  365. private sealed class WhereIterator<T> : Iterator<T>
  366. {
  367. private readonly IEnumerable<T> _source;
  368. private readonly Func<T, bool> _predicate;
  369. private IEnumerator<T> _enumerator;
  370. public WhereIterator(IEnumerable<T> source, Func<T, bool> predicate)
  371. {
  372. _source = source;
  373. _predicate = predicate;
  374. }
  375. public override Iterator<T> Clone() => new WhereIterator<T>(_source, _predicate);
  376. public override bool MoveNext()
  377. {
  378. switch (_state)
  379. {
  380. case 1:
  381. _enumerator = _source.GetEnumerator();
  382. _state = 2;
  383. goto case 2;
  384. case 2:
  385. while (_enumerator.MoveNext())
  386. {
  387. var item = _enumerator.Current;
  388. if (_predicate(item))
  389. {
  390. _current = item;
  391. return true;
  392. }
  393. }
  394. break;
  395. }
  396. return false;
  397. }
  398. public override void Dispose() => _enumerator?.Dispose();
  399. }
  400. }
  401. public static class FastEnumerable
  402. {
  403. public static R Aggregate<T, R>(this IFastEnumerable<T> source, R seed, Func<R, T, R> aggregate)
  404. {
  405. var res = seed;
  406. using (var e = source.GetEnumerator())
  407. {
  408. while (true)
  409. {
  410. var item = e.TryGetNext(out var success);
  411. if (!success)
  412. {
  413. break;
  414. }
  415. res = aggregate(res, item);
  416. }
  417. }
  418. return res;
  419. }
  420. public static IFastEnumerable<T> Empty<T>() => EmptyIterator<T>.Instance;
  421. public static void ForEach<T>(this IFastEnumerable<T> source, Action<T> next)
  422. {
  423. using (var e = source.GetEnumerator())
  424. {
  425. while (true)
  426. {
  427. var item = e.TryGetNext(out var success);
  428. if (!success)
  429. {
  430. break;
  431. }
  432. next(item);
  433. }
  434. }
  435. }
  436. public static IFastEnumerable<int> Range(int start, int count) => new RangeIterator(start, count);
  437. public static IFastEnumerable<R> Select<T, R>(this IFastEnumerable<T> source, Func<T, R> selector) => new SelectFastIterator<T, R>(source, selector);
  438. public static IFastEnumerable<T> ToFastEnumerable<T>(this IEnumerable<T> source) => new EnumerableToFastEnumerable<T>(source);
  439. public static IEnumerable<T> ToEnumerable<T>(this IFastEnumerable<T> source) => new FastEnumerableToEnumerable<T>(source);
  440. public static IFastEnumerable<T> Where<T>(this IFastEnumerable<T> source, Func<T, bool> predicate) => new WhereFastIterator<T>(source, predicate);
  441. private sealed class EmptyIterator<T> : IFastEnumerable<T>, IFastEnumerator<T>
  442. {
  443. public static readonly EmptyIterator<T> Instance = new EmptyIterator<T>();
  444. public void Dispose() { }
  445. public IFastEnumerator<T> GetEnumerator() => this;
  446. public T TryGetNext(out bool success)
  447. {
  448. success = false;
  449. return default(T);
  450. }
  451. }
  452. private sealed class EnumerableToFastEnumerable<T> : FastIterator<T>
  453. {
  454. private readonly IEnumerable<T> _source;
  455. private IEnumerator<T> _enumerator;
  456. public EnumerableToFastEnumerable(IEnumerable<T> source)
  457. {
  458. _source = source;
  459. }
  460. public override FastIterator<T> Clone() => new EnumerableToFastEnumerable<T>(_source);
  461. public override T TryGetNext(out bool success)
  462. {
  463. switch (_state)
  464. {
  465. case 1:
  466. _enumerator = _source.GetEnumerator();
  467. _state = 2;
  468. goto case 2;
  469. case 2:
  470. success = _enumerator.MoveNext();
  471. if (success)
  472. {
  473. return _enumerator.Current;
  474. }
  475. break;
  476. }
  477. success = false;
  478. return default(T);
  479. }
  480. public override void Dispose() => _enumerator?.Dispose();
  481. }
  482. private sealed class FastEnumerableToEnumerable<T> : Iterator<T>
  483. {
  484. private readonly IFastEnumerable<T> _source;
  485. private IFastEnumerator<T> _enumerator;
  486. public FastEnumerableToEnumerable(IFastEnumerable<T> source)
  487. {
  488. _source = source;
  489. }
  490. public override Iterator<T> Clone() => new FastEnumerableToEnumerable<T>(_source);
  491. public override bool MoveNext()
  492. {
  493. switch (_state)
  494. {
  495. case 1:
  496. _enumerator = _source.GetEnumerator();
  497. _state = 2;
  498. goto case 2;
  499. case 2:
  500. _current = _enumerator.TryGetNext(out var success);
  501. return success;
  502. }
  503. return false;
  504. }
  505. public override void Dispose() => _enumerator?.Dispose();
  506. }
  507. private sealed class RangeIterator : FastIterator<int>
  508. {
  509. private readonly int _start;
  510. private readonly int _end;
  511. private int _next;
  512. public RangeIterator(int start, int count)
  513. {
  514. _start = start;
  515. _end = start + count;
  516. }
  517. public override FastIterator<int> Clone() => new RangeIterator(_start, _end - _start);
  518. public override int TryGetNext(out bool success)
  519. {
  520. switch (_state)
  521. {
  522. case 1:
  523. _next = _start;
  524. _state = 2;
  525. goto case 2;
  526. case 2:
  527. if (_next < _end)
  528. {
  529. success = true;
  530. return _next++;
  531. }
  532. break;
  533. }
  534. success = false;
  535. return default(int);
  536. }
  537. }
  538. private sealed class SelectFastIterator<T, R> : FastIterator<R>
  539. {
  540. private readonly IFastEnumerable<T> _source;
  541. private readonly Func<T, R> _selector;
  542. private IFastEnumerator<T> _enumerator;
  543. public SelectFastIterator(IFastEnumerable<T> source, Func<T, R> selector)
  544. {
  545. _source = source;
  546. _selector = selector;
  547. }
  548. public override FastIterator<R> Clone() => new SelectFastIterator<T, R>(_source, _selector);
  549. public override R TryGetNext(out bool success)
  550. {
  551. switch (_state)
  552. {
  553. case 1:
  554. _enumerator = _source.GetEnumerator();
  555. _state = 2;
  556. goto case 2;
  557. case 2:
  558. var item = _enumerator.TryGetNext(out success);
  559. if (success)
  560. {
  561. return _selector(item);
  562. }
  563. break;
  564. }
  565. success = false;
  566. return default(R);
  567. }
  568. public override void Dispose() => _enumerator?.Dispose();
  569. }
  570. private sealed class WhereFastIterator<T> : FastIterator<T>
  571. {
  572. private readonly IFastEnumerable<T> _source;
  573. private readonly Func<T, bool> _predicate;
  574. private IFastEnumerator<T> _enumerator;
  575. public WhereFastIterator(IFastEnumerable<T> source, Func<T, bool> predicate)
  576. {
  577. _source = source;
  578. _predicate = predicate;
  579. }
  580. public override FastIterator<T> Clone() => new WhereFastIterator<T>(_source, _predicate);
  581. public override T TryGetNext(out bool success)
  582. {
  583. switch (_state)
  584. {
  585. case 1:
  586. _enumerator = _source.GetEnumerator();
  587. _state = 2;
  588. goto case 2;
  589. case 2:
  590. while (true)
  591. {
  592. var item = _enumerator.TryGetNext(out success);
  593. if (!success)
  594. {
  595. break;
  596. }
  597. if (_predicate(item))
  598. {
  599. return item;
  600. }
  601. }
  602. break;
  603. }
  604. success = false;
  605. return default(T);
  606. }
  607. public override void Dispose() => _enumerator?.Dispose();
  608. }
  609. }
  610. public static class AsyncEnumerable
  611. {
  612. private static readonly Task<bool> True = Task.FromResult(true);
  613. private static readonly Task<bool> False = Task.FromResult(false);
  614. public static async Task<R> Aggregate<T, R>(this IAsyncEnumerable<T> source, R seed, Func<R, T, R> aggregate)
  615. {
  616. var res = seed;
  617. var e = source.GetAsyncEnumerator();
  618. try
  619. {
  620. while (await e.MoveNextAsync().ConfigureAwait(false))
  621. {
  622. res = aggregate(res, e.Current);
  623. }
  624. }
  625. finally
  626. {
  627. await e.DisposeAsync().ConfigureAwait(false);
  628. }
  629. return res;
  630. }
  631. public static async Task<R> Aggregate<T, R>(this IAsyncEnumerable<T> source, R seed, Func<R, T, Task<R>> aggregate)
  632. {
  633. var res = seed;
  634. var e = source.GetAsyncEnumerator();
  635. try
  636. {
  637. while (await e.MoveNextAsync().ConfigureAwait(false))
  638. {
  639. res = await aggregate(res, e.Current).ConfigureAwait(false);
  640. }
  641. }
  642. finally
  643. {
  644. await e.DisposeAsync().ConfigureAwait(false);
  645. }
  646. return res;
  647. }
  648. public static IAsyncEnumerable<T> Empty<T>() => EmptyIterator<T>.Instance;
  649. public static async Task ForEachAsync<T>(this IAsyncEnumerable<T> source, Func<T, Task> next)
  650. {
  651. var e = source.GetAsyncEnumerator();
  652. try
  653. {
  654. while (await e.MoveNextAsync().ConfigureAwait(false))
  655. {
  656. var item = e.Current;
  657. await next(item).ConfigureAwait(false);
  658. }
  659. }
  660. finally
  661. {
  662. await e.DisposeAsync().ConfigureAwait(false);
  663. }
  664. }
  665. public static IAsyncEnumerable<int> Range(int start, int count) => new RangeIterator(start, count);
  666. public static IAsyncEnumerable<R> Select<T, R>(this IAsyncEnumerable<T> source, Func<T, R> selector) => new SelectIterator<T, R>(source, selector);
  667. public static IAsyncEnumerable<R> Select<T, R>(this IAsyncEnumerable<T> source, Func<T, Task<R>> selector) => new SelectIteratorWithTask<T, R>(source, selector);
  668. public static IAsyncEnumerable<T> Where<T>(this IAsyncEnumerable<T> source, Func<T, bool> predicate) => new WhereIterator<T>(source, predicate);
  669. public static IAsyncEnumerable<T> Where<T>(this IAsyncEnumerable<T> source, Func<T, Task<bool>> predicate) => new WhereIteratorWithTask<T>(source, predicate);
  670. private sealed class EmptyIterator<T> : IAsyncEnumerable<T>, IAsyncEnumerator<T>
  671. {
  672. public static readonly EmptyIterator<T> Instance = new EmptyIterator<T>();
  673. public T Current => default(T);
  674. public Task DisposeAsync() => Task.CompletedTask;
  675. public IAsyncEnumerator<T> GetAsyncEnumerator() => this;
  676. public Task<bool> MoveNextAsync() => False;
  677. }
  678. private sealed class RangeIterator : AsyncIterator<int>
  679. {
  680. private readonly int _start;
  681. private readonly int _end;
  682. private int _next;
  683. public RangeIterator(int start, int count)
  684. {
  685. _start = start;
  686. _end = start + count;
  687. }
  688. public override AsyncIterator<int> Clone() => new RangeIterator(_start, _end - _start);
  689. public override Task<bool> MoveNextAsync()
  690. {
  691. switch (_state)
  692. {
  693. case 1:
  694. _next = _start;
  695. _state = 2;
  696. goto case 2;
  697. case 2:
  698. if (_next < _end)
  699. {
  700. _current = _next++;
  701. return True;
  702. }
  703. break;
  704. }
  705. return False;
  706. }
  707. }
  708. private sealed class SelectIterator<T, R> : AsyncIterator<R>
  709. {
  710. private readonly IAsyncEnumerable<T> _source;
  711. private readonly Func<T, R> _selector;
  712. private IAsyncEnumerator<T> _enumerator;
  713. public SelectIterator(IAsyncEnumerable<T> source, Func<T, R> selector)
  714. {
  715. _source = source;
  716. _selector = selector;
  717. }
  718. public override AsyncIterator<R> Clone() => new SelectIterator<T, R>(_source, _selector);
  719. public override async Task<bool> MoveNextAsync()
  720. {
  721. switch (_state)
  722. {
  723. case 1:
  724. _enumerator = _source.GetAsyncEnumerator();
  725. _state = 2;
  726. goto case 2;
  727. case 2:
  728. if (await _enumerator.MoveNextAsync().ConfigureAwait(false))
  729. {
  730. _current = _selector(_enumerator.Current);
  731. return true;
  732. }
  733. break;
  734. }
  735. return false;
  736. }
  737. public override Task DisposeAsync() => _enumerator?.DisposeAsync() ?? Task.CompletedTask;
  738. }
  739. private sealed class SelectIteratorWithTask<T, R> : AsyncIterator<R>
  740. {
  741. private readonly IAsyncEnumerable<T> _source;
  742. private readonly Func<T, Task<R>> _selector;
  743. private IAsyncEnumerator<T> _enumerator;
  744. public SelectIteratorWithTask(IAsyncEnumerable<T> source, Func<T, Task<R>> selector)
  745. {
  746. _source = source;
  747. _selector = selector;
  748. }
  749. public override AsyncIterator<R> Clone() => new SelectIteratorWithTask<T, R>(_source, _selector);
  750. public override async Task<bool> MoveNextAsync()
  751. {
  752. switch (_state)
  753. {
  754. case 1:
  755. _enumerator = _source.GetAsyncEnumerator();
  756. _state = 2;
  757. goto case 2;
  758. case 2:
  759. if (await _enumerator.MoveNextAsync().ConfigureAwait(false))
  760. {
  761. _current = await _selector(_enumerator.Current).ConfigureAwait(false);
  762. return true;
  763. }
  764. break;
  765. }
  766. return false;
  767. }
  768. public override Task DisposeAsync() => _enumerator?.DisposeAsync() ?? Task.CompletedTask;
  769. }
  770. private sealed class WhereIterator<T> : AsyncIterator<T>
  771. {
  772. private readonly IAsyncEnumerable<T> _source;
  773. private readonly Func<T, bool> _predicate;
  774. private IAsyncEnumerator<T> _enumerator;
  775. public WhereIterator(IAsyncEnumerable<T> source, Func<T, bool> predicate)
  776. {
  777. _source = source;
  778. _predicate = predicate;
  779. }
  780. public override AsyncIterator<T> Clone() => new WhereIterator<T>(_source, _predicate);
  781. public override async Task<bool> MoveNextAsync()
  782. {
  783. switch (_state)
  784. {
  785. case 1:
  786. _enumerator = _source.GetAsyncEnumerator();
  787. _state = 2;
  788. goto case 2;
  789. case 2:
  790. while (await _enumerator.MoveNextAsync().ConfigureAwait(false))
  791. {
  792. var item = _enumerator.Current;
  793. if (_predicate(item))
  794. {
  795. _current = item;
  796. return true;
  797. }
  798. }
  799. break;
  800. }
  801. return false;
  802. }
  803. public override Task DisposeAsync() => _enumerator?.DisposeAsync() ?? Task.CompletedTask;
  804. }
  805. private sealed class WhereIteratorWithTask<T> : AsyncIterator<T>
  806. {
  807. private readonly IAsyncEnumerable<T> _source;
  808. private readonly Func<T, Task<bool>> _predicate;
  809. private IAsyncEnumerator<T> _enumerator;
  810. public WhereIteratorWithTask(IAsyncEnumerable<T> source, Func<T, Task<bool>> predicate)
  811. {
  812. _source = source;
  813. _predicate = predicate;
  814. }
  815. public override AsyncIterator<T> Clone() => new WhereIteratorWithTask<T>(_source, _predicate);
  816. public override async Task<bool> MoveNextAsync()
  817. {
  818. switch (_state)
  819. {
  820. case 1:
  821. _enumerator = _source.GetAsyncEnumerator();
  822. _state = 2;
  823. goto case 2;
  824. case 2:
  825. while (await _enumerator.MoveNextAsync().ConfigureAwait(false))
  826. {
  827. var item = _enumerator.Current;
  828. if (await _predicate(item).ConfigureAwait(false))
  829. {
  830. _current = item;
  831. return true;
  832. }
  833. }
  834. break;
  835. }
  836. return false;
  837. }
  838. public override Task DisposeAsync() => _enumerator?.DisposeAsync() ?? Task.CompletedTask;
  839. }
  840. }
  841. public static class AsyncFastEnumerable
  842. {
  843. private static readonly Task<bool> True = Task.FromResult(true);
  844. private static readonly Task<bool> False = Task.FromResult(false);
  845. public static async Task<R> Aggregate<T, R>(this IAsyncFastEnumerable<T> source, R seed, Func<R, T, R> aggregate)
  846. {
  847. var res = seed;
  848. var e = source.GetAsyncEnumerator();
  849. try
  850. {
  851. while (await e.WaitForNextAsync().ConfigureAwait(false))
  852. {
  853. while (true)
  854. {
  855. var item = e.TryGetNext(out var success);
  856. if (!success)
  857. {
  858. break;
  859. }
  860. res = aggregate(res, item);
  861. }
  862. }
  863. }
  864. finally
  865. {
  866. await e.DisposeAsync().ConfigureAwait(false);
  867. }
  868. return res;
  869. }
  870. public static async Task<R> Aggregate<T, R>(this IAsyncFastEnumerable<T> source, R seed, Func<R, T, Task<R>> aggregate)
  871. {
  872. var res = seed;
  873. var e = source.GetAsyncEnumerator();
  874. try
  875. {
  876. while (await e.WaitForNextAsync().ConfigureAwait(false))
  877. {
  878. while (true)
  879. {
  880. var item = e.TryGetNext(out var success);
  881. if (!success)
  882. {
  883. break;
  884. }
  885. res = await aggregate(res, item).ConfigureAwait(false);
  886. }
  887. }
  888. }
  889. finally
  890. {
  891. await e.DisposeAsync().ConfigureAwait(false);
  892. }
  893. return res;
  894. }
  895. public static IAsyncFastEnumerable<T> Empty<T>() => EmptyIterator<T>.Instance;
  896. public static async Task ForEachAsync<T>(this IAsyncFastEnumerable<T> source, Func<T, Task> next)
  897. {
  898. var e = source.GetAsyncEnumerator();
  899. try
  900. {
  901. while (await e.WaitForNextAsync().ConfigureAwait(false))
  902. {
  903. while (true)
  904. {
  905. var item = e.TryGetNext(out var success);
  906. if (!success)
  907. {
  908. break;
  909. }
  910. await next(item).ConfigureAwait(false);
  911. }
  912. }
  913. }
  914. finally
  915. {
  916. await e.DisposeAsync().ConfigureAwait(false);
  917. }
  918. }
  919. public static IAsyncFastEnumerable<int> Range(int start, int count) => new RangeIterator(start, count);
  920. public static IAsyncFastEnumerable<R> Select<T, R>(this IAsyncFastEnumerable<T> source, Func<T, R> selector) => new SelectFastIterator<T, R>(source, selector);
  921. public static IAsyncFastEnumerable<R> Select<T, R>(this IAsyncFastEnumerable<T> source, Func<T, Task<R>> selector) => new SelectFastIteratorWithTask<T, R>(source, selector);
  922. public static IAsyncFastEnumerable<T> ToAsyncFastEnumerable<T>(this IAsyncEnumerable<T> source) => new AsyncEnumerableToAsyncFastEnumerable<T>(source);
  923. public static IAsyncEnumerable<T> ToAsyncEnumerable<T>(this IAsyncFastEnumerable<T> source) => new AsyncFastEnumerableToAsyncEnumerable<T>(source);
  924. public static IAsyncFastEnumerable<T> Where<T>(this IAsyncFastEnumerable<T> source, Func<T, bool> predicate) => new WhereFastIterator<T>(source, predicate);
  925. public static IAsyncFastEnumerable<T> Where<T>(this IAsyncFastEnumerable<T> source, Func<T, Task<bool>> predicate) => new WhereFastIteratorWithTask<T>(source, predicate);
  926. private sealed class EmptyIterator<T> : IAsyncFastEnumerable<T>, IAsyncFastEnumerator<T>
  927. {
  928. public static readonly EmptyIterator<T> Instance = new EmptyIterator<T>();
  929. public Task DisposeAsync() => Task.CompletedTask;
  930. public IAsyncFastEnumerator<T> GetAsyncEnumerator() => this;
  931. public T TryGetNext(out bool success)
  932. {
  933. success = false;
  934. return default(T);
  935. }
  936. public Task<bool> WaitForNextAsync() => False;
  937. }
  938. private sealed class AsyncEnumerableToAsyncFastEnumerable<T> : AsyncFastIterator<T>
  939. {
  940. private readonly IAsyncEnumerable<T> _source;
  941. private IAsyncEnumerator<T> _enumerator;
  942. private bool _hasNext;
  943. public AsyncEnumerableToAsyncFastEnumerable(IAsyncEnumerable<T> source)
  944. {
  945. _source = source;
  946. }
  947. public override AsyncFastIterator<T> Clone() => new AsyncEnumerableToAsyncFastEnumerable<T>(_source);
  948. public override T TryGetNext(out bool success)
  949. {
  950. success = _hasNext;
  951. _hasNext = false;
  952. return success ? _enumerator.Current : default(T);
  953. }
  954. public override Task DisposeAsync() => _enumerator?.DisposeAsync() ?? Task.CompletedTask;
  955. public override async Task<bool> WaitForNextAsync()
  956. {
  957. switch (_state)
  958. {
  959. case 1:
  960. _enumerator = _source.GetAsyncEnumerator();
  961. _state = 2;
  962. goto case 2;
  963. case 2:
  964. _hasNext = await _enumerator.MoveNextAsync().ConfigureAwait(false);
  965. return _hasNext;
  966. }
  967. return false;
  968. }
  969. }
  970. private sealed class AsyncFastEnumerableToAsyncEnumerable<T> : AsyncIterator<T>
  971. {
  972. private readonly IAsyncFastEnumerable<T> _source;
  973. private IAsyncFastEnumerator<T> _enumerator;
  974. public AsyncFastEnumerableToAsyncEnumerable(IAsyncFastEnumerable<T> source)
  975. {
  976. _source = source;
  977. }
  978. public override AsyncIterator<T> Clone() => new AsyncFastEnumerableToAsyncEnumerable<T>(_source);
  979. public override async Task<bool> MoveNextAsync()
  980. {
  981. switch (_state)
  982. {
  983. case 1:
  984. _enumerator = _source.GetAsyncEnumerator();
  985. _state = 2;
  986. goto case 2;
  987. case 2:
  988. do
  989. {
  990. while (true)
  991. {
  992. var item = _enumerator.TryGetNext(out var success);
  993. if (!success)
  994. {
  995. break;
  996. }
  997. else
  998. {
  999. _current = item;
  1000. return true;
  1001. }
  1002. }
  1003. } while (await _enumerator.WaitForNextAsync().ConfigureAwait(false));
  1004. break;
  1005. }
  1006. return false;
  1007. }
  1008. public override Task DisposeAsync() => _enumerator?.DisposeAsync() ?? Task.CompletedTask;
  1009. }
  1010. private sealed class RangeIterator : AsyncFastIterator<int>
  1011. {
  1012. private readonly int _start;
  1013. private readonly int _end;
  1014. private int _next;
  1015. public RangeIterator(int start, int count)
  1016. {
  1017. _start = start;
  1018. _end = start + count;
  1019. }
  1020. public override AsyncFastIterator<int> Clone() => new RangeIterator(_start, _end - _start);
  1021. public override int TryGetNext(out bool success)
  1022. {
  1023. if (_state == 2 && _next < _end)
  1024. {
  1025. success = true;
  1026. return _next++;
  1027. }
  1028. success = false;
  1029. return default(int);
  1030. }
  1031. public override Task<bool> WaitForNextAsync()
  1032. {
  1033. switch (_state)
  1034. {
  1035. case 1:
  1036. _next = _start;
  1037. _state = 2;
  1038. goto case 2;
  1039. case 2:
  1040. if (_next < _end)
  1041. {
  1042. return True;
  1043. }
  1044. break;
  1045. }
  1046. return False;
  1047. }
  1048. }
  1049. private sealed class SelectFastIterator<T, R> : AsyncFastIterator<R>
  1050. {
  1051. private readonly IAsyncFastEnumerable<T> _source;
  1052. private readonly Func<T, R> _selector;
  1053. private IAsyncFastEnumerator<T> _enumerator;
  1054. public SelectFastIterator(IAsyncFastEnumerable<T> source, Func<T, R> selector)
  1055. {
  1056. _source = source;
  1057. _selector = selector;
  1058. }
  1059. public override AsyncFastIterator<R> Clone() => new SelectFastIterator<T, R>(_source, _selector);
  1060. public override R TryGetNext(out bool success)
  1061. {
  1062. if (_enumerator != null)
  1063. {
  1064. var item = _enumerator.TryGetNext(out success);
  1065. if (success)
  1066. {
  1067. return _selector(item);
  1068. }
  1069. }
  1070. success = false;
  1071. return default(R);
  1072. }
  1073. public override Task DisposeAsync() => _enumerator?.DisposeAsync() ?? Task.CompletedTask;
  1074. public override Task<bool> WaitForNextAsync()
  1075. {
  1076. switch (_state)
  1077. {
  1078. case 1:
  1079. _enumerator = _source.GetAsyncEnumerator();
  1080. _state = 2;
  1081. goto case 2;
  1082. case 2:
  1083. return _enumerator.WaitForNextAsync();
  1084. }
  1085. return False;
  1086. }
  1087. }
  1088. private sealed class SelectFastIteratorWithTask<T, R> : AsyncFastIterator<R>
  1089. {
  1090. private readonly IAsyncFastEnumerable<T> _source;
  1091. private readonly Func<T, Task<R>> _selector;
  1092. private IAsyncFastEnumerator<T> _enumerator;
  1093. private bool _hasNext;
  1094. private R _next;
  1095. public SelectFastIteratorWithTask(IAsyncFastEnumerable<T> source, Func<T, Task<R>> selector)
  1096. {
  1097. _source = source;
  1098. _selector = selector;
  1099. }
  1100. public override AsyncFastIterator<R> Clone() => new SelectFastIteratorWithTask<T, R>(_source, _selector);
  1101. public override R TryGetNext(out bool success)
  1102. {
  1103. success = _hasNext;
  1104. _hasNext = false;
  1105. return success ? _next : default(R);
  1106. }
  1107. public override Task DisposeAsync() => _enumerator?.DisposeAsync() ?? Task.CompletedTask;
  1108. public override async Task<bool> WaitForNextAsync()
  1109. {
  1110. switch (_state)
  1111. {
  1112. case 1:
  1113. _enumerator = _source.GetAsyncEnumerator();
  1114. _state = 2;
  1115. goto case 2;
  1116. case 2:
  1117. do
  1118. {
  1119. while (true)
  1120. {
  1121. var item = _enumerator.TryGetNext(out var success);
  1122. if (!success)
  1123. {
  1124. break;
  1125. }
  1126. else
  1127. {
  1128. _hasNext = true;
  1129. _next = await _selector(item).ConfigureAwait(false);
  1130. return true;
  1131. }
  1132. }
  1133. }
  1134. while (await _enumerator.WaitForNextAsync().ConfigureAwait(false));
  1135. break;
  1136. }
  1137. _hasNext = false;
  1138. _next = default(R);
  1139. return false;
  1140. }
  1141. }
  1142. private sealed class WhereFastIterator<T> : AsyncFastIterator<T>
  1143. {
  1144. private readonly IAsyncFastEnumerable<T> _source;
  1145. private readonly Func<T, bool> _predicate;
  1146. private IAsyncFastEnumerator<T> _enumerator;
  1147. public WhereFastIterator(IAsyncFastEnumerable<T> source, Func<T, bool> predicate)
  1148. {
  1149. _source = source;
  1150. _predicate = predicate;
  1151. }
  1152. public override AsyncFastIterator<T> Clone() => new WhereFastIterator<T>(_source, _predicate);
  1153. public override T TryGetNext(out bool success)
  1154. {
  1155. if (_enumerator != null)
  1156. {
  1157. while (true)
  1158. {
  1159. var item = _enumerator.TryGetNext(out success);
  1160. if (!success)
  1161. {
  1162. break;
  1163. }
  1164. if (_predicate(item))
  1165. {
  1166. return item;
  1167. }
  1168. }
  1169. }
  1170. success = false;
  1171. return default(T);
  1172. }
  1173. public override Task DisposeAsync() => _enumerator?.DisposeAsync() ?? Task.CompletedTask;
  1174. public override Task<bool> WaitForNextAsync()
  1175. {
  1176. switch (_state)
  1177. {
  1178. case 1:
  1179. _enumerator = _source.GetAsyncEnumerator();
  1180. _state = 2;
  1181. goto case 2;
  1182. case 2:
  1183. return _enumerator.WaitForNextAsync();
  1184. }
  1185. return False;
  1186. }
  1187. }
  1188. private sealed class WhereFastIteratorWithTask<T> : AsyncFastIterator<T>
  1189. {
  1190. private readonly IAsyncFastEnumerable<T> _source;
  1191. private readonly Func<T, Task<bool>> _predicate;
  1192. private IAsyncFastEnumerator<T> _enumerator;
  1193. private bool _hasNext;
  1194. private T _next;
  1195. public WhereFastIteratorWithTask(IAsyncFastEnumerable<T> source, Func<T, Task<bool>> predicate)
  1196. {
  1197. _source = source;
  1198. _predicate = predicate;
  1199. }
  1200. public override AsyncFastIterator<T> Clone() => new WhereFastIteratorWithTask<T>(_source, _predicate);
  1201. public override T TryGetNext(out bool success)
  1202. {
  1203. success = _hasNext;
  1204. _hasNext = false;
  1205. return success ? _next : default(T);
  1206. }
  1207. public override Task DisposeAsync() => _enumerator?.DisposeAsync() ?? Task.CompletedTask;
  1208. public override async Task<bool> WaitForNextAsync()
  1209. {
  1210. switch (_state)
  1211. {
  1212. case 1:
  1213. _enumerator = _source.GetAsyncEnumerator();
  1214. _state = 2;
  1215. goto case 2;
  1216. case 2:
  1217. do
  1218. {
  1219. while (true)
  1220. {
  1221. var item = _enumerator.TryGetNext(out var success);
  1222. if (!success)
  1223. {
  1224. break;
  1225. }
  1226. else
  1227. {
  1228. if (await _predicate(item).ConfigureAwait(false))
  1229. {
  1230. _hasNext = true;
  1231. _next = item;
  1232. return true;
  1233. }
  1234. }
  1235. }
  1236. }
  1237. while (await _enumerator.WaitForNextAsync().ConfigureAwait(false));
  1238. break;
  1239. }
  1240. _hasNext = false;
  1241. _next = default(T);
  1242. return false;
  1243. }
  1244. }
  1245. }
  1246. }