mirror of
https://github.com/MAKS-IT-COM/maksit-postclient.git
synced 2026-11-14 22:26:09 +01:00
51 lines
1.5 KiB
C#
51 lines
1.5 KiB
C#
namespace MaksIT.PostClient.Shared.Mail;
|
|
|
|
|
|
public static class MailListOrder {
|
|
public static List<List<MailChainLink>> ThreadBlocks(IReadOnlyList<MailChainLink> links) {
|
|
ArgumentNullException.ThrowIfNull(links);
|
|
var blocks = new List<List<MailChainLink>>();
|
|
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<MailChainLink>(take);
|
|
for (var n = 0; n < take; n++)
|
|
block.Add(links[i + n]);
|
|
blocks.Add(block);
|
|
i += take;
|
|
}
|
|
|
|
return blocks;
|
|
}
|
|
|
|
public static IReadOnlyList<MailChainLink> ReorderThreads(
|
|
IReadOnlyList<MailChainLink> links,
|
|
Comparison<uint> 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<MailChainLink> ReverseThreads(IReadOnlyList<MailChainLink> links) {
|
|
ArgumentNullException.ThrowIfNull(links);
|
|
var blocks = ThreadBlocks(links);
|
|
blocks.Reverse();
|
|
return Flatten(blocks);
|
|
}
|
|
|
|
private static List<MailChainLink> Flatten(List<List<MailChainLink>> blocks) {
|
|
var rows = new List<MailChainLink>();
|
|
foreach (var block in blocks)
|
|
rows.AddRange(block);
|
|
return rows;
|
|
}
|
|
}
|