search static method

dynamic search(
  1. dynamic mapOrList,
  2. String query
)

Implementation

static dynamic search(dynamic mapOrList, String query) {
  String getValue(dynamic item) {
    if (item is Data) {
      item = item.value;
    } else if (item is MapEntry) {
      item = getValue(item.value);
    }
    return item.toString();
  }

  if (mapOrList is Data) mapOrList = mapOrList.value;

  if (mapOrList is List) {
    if (query.isEmpty) {
      return mapOrList.map(
        (e) => {'value': e is Data ? e : Data(e), 'positions': Data([])},
      );
    }
    List<dynamic> result = [];
    for (final entry in mapOrList) {
      final value = getValue(entry);
      final fuzzy = DataSearch(needle: query, haystack: value);
      if (fuzzy.hasMatch) {
        result.add({
          'value': value is Data ? value : Data(value),
          'positions': Data(
            fuzzy.positions.map((e) => Data(e.toString())).toList(),
          ),
        });
      }
    }
    return result;
  } else if (mapOrList is Map) {
    List<MapEntry> entries = [];
    for (final entry in mapOrList.entries) {
      final value = getValue(entry);
      if (query.isEmpty) {
        entries.add(
          MapEntry(entry.key, {
            'value': entry.value is Data ? entry.value : Data(entry.value),
            'positions': Data([]),
          }),
        );
        continue;
      }
      final fuzzy = DataSearch(needle: query, haystack: value);
      if (fuzzy.hasMatch) {
        entries.add(
          MapEntry(entry.key, {
            'value': entry.value is Data ? entry.value : Data(entry.value),
            'positions': Data(
              fuzzy.positions.map((e) => Data(e.toString())).toList(),
            ),
          }),
        );
      }
    }
    return Map.fromEntries(entries);
  }

  return mapOrList;
}