import '../models/entry_tree_item.dart'; import '../models/flattened_tree_item.dart'; extension FlatteningExtensions on EntryTreeItem { static const baseLevel = 0; List flatten( {int level = baseLevel, bool topLevelOnly = false}) { final items = []; final myEntry = FlattenedTreeItem( timelineEntry: entry, isMine: isMine, level: level, ); items.add(myEntry); if (topLevelOnly) { return items; } final sortedChildren = [...children]; sortedChildren.sort((c1, c2) => c1.entry.creationTimestamp.compareTo(c2.entry.creationTimestamp)); for (final child in sortedChildren) { int childLevel = level + 1; if (child.entry.authorId == entry.authorId && level != baseLevel) { childLevel = level; } final childItems = child.flatten(level: childLevel); childItems.sort((c1, c2) { if (c2.level == c1.level) { return c1.timelineEntry.creationTimestamp .compareTo(c2.timelineEntry.creationTimestamp); } if (c1.level == childLevel) { return -1; } if (c2.level == childLevel) { return 1; } return 0; }); items.addAll(childItems); } return items; } }