From 9e9d2dfc18f97783b91f4b9257986f03ab73cab5 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Fri, 5 May 2023 01:55:03 +0530 Subject: [PATCH] chore: improve comparator. Signed-off-by: xsahil03x --- .../src/stream_chat_persistence_client.dart | 66 +++++++++++-------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/packages/stream_chat_persistence/lib/src/stream_chat_persistence_client.dart b/packages/stream_chat_persistence/lib/src/stream_chat_persistence_client.dart index 9d2cb955..b19977db 100644 --- a/packages/stream_chat_persistence/lib/src/stream_chat_persistence_client.dart +++ b/packages/stream_chat_persistence/lib/src/stream_chat_persistence_client.dart @@ -268,38 +268,14 @@ class StreamChatPersistenceClient extends ChatPersistenceClient { // Only sort the channel states if the channels are not already sorted. if (sort == null) { - var chainedComparator = (ChannelState a, ChannelState b) { - final dateA = a.channel?.lastMessageAt ?? a.channel?.createdAt; - final dateB = b.channel?.lastMessageAt ?? b.channel?.createdAt; - - if (dateA == null && dateB == null) { - return 0; - } else if (dateA == null) { - return 1; - } else if (dateB == null) { - return -1; - } else { - return dateB.compareTo(dateA); - } - }; - + var comparator = _defaultChannelStateComparator; if (channelStateSort != null && channelStateSort.isNotEmpty) { - chainedComparator = (a, b) { - int result; - for (final comparator - in channelStateSort.map((it) => it.comparator).withNullifyer) { - try { - result = comparator(a, b); - } catch (e) { - result = 0; - } - if (result != 0) return result; - } - return 0; - }; + comparator = _combineComparators( + channelStateSort.map((it) => it.comparator).withNullifyer, + ); } - channelStates.sort(chainedComparator); + channelStates.sort(comparator); } final offset = paginationParams?.offset; @@ -439,3 +415,35 @@ class StreamChatPersistenceClient extends ChatPersistenceClient { } } } + +// Creates a new combined [Comparator] which sorts items +// by the given [comparators]. +Comparator _combineComparators(Iterable> comparators) { + return (T a, T b) { + for (final comparator in comparators) { + try { + final result = comparator(a, b); + if (result != 0) return result; + } catch (e) { + // If the comparator throws an exception, we ignore it and + // continue with the next comparator. + continue; + } + } + return 0; + }; +} + +// The default [Comparator] used to sort [ChannelState]s. +int _defaultChannelStateComparator(ChannelState a, ChannelState b) { + final dateA = a.channel?.lastMessageAt ?? a.channel?.createdAt; + final dateB = b.channel?.lastMessageAt ?? b.channel?.createdAt; + + if (dateA == null && dateB == null) return 0; + if (dateA == null) return 1; + if (dateB == null) { + return -1; + } else { + return dateB.compareTo(dateA); + } +}