buildConversationOrder function

List<int> buildConversationOrder(
  1. List<ConversationEntry> entries, {
  2. String query = '',
  3. ConversationMatcher? matcher,
})

Returns source entry indexes in display order after applying query.

Implementation

List<int> buildConversationOrder(
  List<ConversationEntry> entries, {
  String query = '',
  ConversationMatcher? matcher,
}) {
  final trimmed = _sanitizeConversationText(query).trim();
  if (trimmed.isEmpty) {
    return List<int>.unmodifiable(
      List<int>.generate(entries.length, (index) => index),
    );
  }
  if (matcher != null) {
    return List<int>.unmodifiable([
      for (var index = 0; index < entries.length; index++)
        if (matcher(entries[index], trimmed)) index,
    ]);
  }

  final q = trimmed.toLowerCase();
  final exact = <int>[];
  final prefix = <int>[];
  final contains = <int>[];
  final fuzzy = <int>[];
  for (var index = 0; index < entries.length; index++) {
    switch (_conversationRank(entries[index], q)) {
      case _ConversationRank.exact:
        exact.add(index);
      case _ConversationRank.prefix:
        prefix.add(index);
      case _ConversationRank.contains:
        contains.add(index);
      case _ConversationRank.fuzzy:
        fuzzy.add(index);
      case null:
        break;
    }
  }
  return List<int>.unmodifiable([...exact, ...prefix, ...contains, ...fuzzy]);
}