namespace MaksIT.PostClient.Shared.Mail; public static class MailListOrder { public static List> ThreadBlocks(IReadOnlyList links) { ArgumentNullException.ThrowIfNull(links); var blocks = new List>(); for (var i = 0; i < links.Count;) { var take = 1; if (i + 1 < links.Count && links[i + 1].Depth > 0) { while (i + take < links.Count && links[i + take].Depth > 0) take++; } else if (links[i].Size > 1) take = Math.Min(links[i].Size, links.Count - i); var block = new List(take); for (var n = 0; n < take; n++) block.Add(links[i + n]); blocks.Add(block); i += take; } return blocks; } public static IReadOnlyList ReorderThreads( IReadOnlyList links, Comparison compareRoots) { ArgumentNullException.ThrowIfNull(links); ArgumentNullException.ThrowIfNull(compareRoots); var blocks = ThreadBlocks(links); blocks.Sort((a, b) => compareRoots(a[0].Uid, b[0].Uid)); return Flatten(blocks); } public static IReadOnlyList ReverseThreads(IReadOnlyList links) { ArgumentNullException.ThrowIfNull(links); var blocks = ThreadBlocks(links); blocks.Reverse(); return Flatten(blocks); } private static List Flatten(List> blocks) { var rows = new List(); foreach (var block in blocks) rows.AddRange(block); return rows; } }