lemmur-app-android/lib/comment_tree.dart

89 lines
2.3 KiB
Dart
Raw Normal View History

2021-01-24 20:01:55 +01:00
import 'package:lemmy_api_client/v2.dart';
import 'util/hot_rank.dart';
enum CommentSortType {
hot,
top,
// ignore: constant_identifier_names
new_,
old,
chat,
}
2020-10-23 00:42:42 +02:00
extension on CommentSortType {
/// returns a compare function for sorting a CommentTree according
/// to the comment sort type
int Function(CommentTree a, CommentTree b) get sortFunction {
switch (this) {
case CommentSortType.chat:
throw Exception('Sorting a CommentTree in chat mode is not supported'
' because it would restructure the whole tree');
case CommentSortType.hot:
return (b, a) =>
a.comment.computedHotRank.compareTo(b.comment.computedHotRank);
case CommentSortType.new_:
2021-01-24 20:01:55 +01:00
return (b, a) =>
a.comment.comment.published.compareTo(b.comment.comment.published);
2020-10-23 00:42:42 +02:00
case CommentSortType.old:
2021-01-24 20:01:55 +01:00
return (b, a) =>
b.comment.comment.published.compareTo(a.comment.comment.published);
2020-10-23 00:42:42 +02:00
case CommentSortType.top:
2021-01-24 20:01:55 +01:00
return (b, a) =>
a.comment.counts.score.compareTo(b.comment.counts.score);
2020-10-23 00:42:42 +02:00
}
throw Exception('unreachable');
}
}
class CommentTree {
CommentView comment;
List<CommentTree> children;
CommentTree(this.comment, [this.children]) {
children ??= [];
}
2020-10-23 00:42:42 +02:00
/// takes raw linear comments and turns them into a CommentTree
static List<CommentTree> fromList(List<CommentView> comments) {
CommentTree gatherChildren(CommentTree parent) {
2020-09-16 23:22:04 +02:00
for (final el in comments) {
2021-01-24 20:01:55 +01:00
if (el.comment.parentId == parent.comment.comment.id) {
parent.children.add(gatherChildren(CommentTree(el)));
}
}
return parent;
}
2021-01-24 20:01:55 +01:00
final topLevelParents = comments
.where((e) => e.comment.parentId == null)
.map((e) => CommentTree(e));
2020-10-23 00:42:42 +02:00
final result = topLevelParents.map(gatherChildren).toList();
return result;
}
2020-10-23 00:42:42 +02:00
/// recursive sorter
void _sort(int compare(CommentTree a, CommentTree b)) {
children.sort(compare);
2020-09-16 23:22:04 +02:00
for (final el in children) {
el._sort(compare);
}
}
2020-10-23 00:42:42 +02:00
/// Sorts in-place a list of CommentTrees according to a given sortType
static List<CommentTree> sortList(
CommentSortType sortType, List<CommentTree> comms) {
2020-10-23 00:42:42 +02:00
comms.sort(sortType.sortFunction);
for (final el in comms) {
el._sort(sortType.sortFunction);
}
2020-10-23 00:42:42 +02:00
return comms;
}
}