find method

Future<Iterable<Fractal>> find(
  1. MP filter, {
  2. int limit = 0,
  3. MP order = const {'created_at' : true},
})

Implementation

Future<Iterable<Fractal>> find(
  MP filter, {
  int limit = 0,
  MP order = const {'created_at': true},
}) async {
  var r = <MP>[];
  final col = <MP>[];

  final filterFutures = <Future<EventFractal>>[];
  for (var fe in filter.entries) {
    if (fe.value case String fs when EventFractal.isHash(fs)) {
      final key = fe.key;
      filterFutures.add(
        NetworkFractal.request<EventFractal>(fs).then((f) {
          filter[key] = f.id;
          return f;
        }),
      );
    }
  }

  await Future.wait(filterFutures);

  r = (await select(
    where: filter,
    limit: limit,
    order: order,
    //includeSubTypes: includeSubTypes,
  ))
      .reversed
      .where((m) {
    final same = m['type'] == name;
    if (!same) col.add(m);
    return same;
  }).toList();

  final fus = <Future<Fractal?>>[
    if (col.isNotEmpty) ...FilterF.collect(col),
  ];

  for (MP item in r) {
    final putF = put(MakeF(item)).then((f) => f, onError: (e) {
      print('failed making same: $e');
    });
    fus.add(putF);
    //fractals.add(f);
  }

  final items = await Future.wait(fus);

  return items.whereType<Fractal>();
}