reorder method

Future<Iterable<T>> reorder(
  1. T model,
  2. int newOrdinal, {
  3. String? databaseName,
})

Reorders the model to have the newOrdinal value for ordinal

This will automatically change the ordinal value for the other T in map. This will also automatically update repository

Implementation

Future<Iterable<T>> reorder(
  T model,
  int newOrdinal, {
  String? databaseName,
}) async {
  final list = defaultOrderedKeyList;

  final checkedOrdinal = min(newOrdinal, list.length);
  final initialOrdinal = list.indexOf(model.id!);

  if (checkedOrdinal == initialOrdinal) {
    return [];
  }

  final updatedModels = <T>{};

  for (var i = 0; i < list.length; i++) {
    final pastOldIndex = i >= initialOrdinal;
    final pastNewIndex = i >= checkedOrdinal;

    if (!pastOldIndex && !pastNewIndex) {
      continue;
    }
    if (pastNewIndex && pastOldIndex) {
      break;
    }
    final updatedModel = map[list[i]]!;
    updatedModels.add(updatedModel);
    if (pastNewIndex) {
      updatedModel.ordinal = list.length - i - 2;
    }
    if (pastOldIndex) {
      updatedModel.ordinal = list.length - i;
    }
  }
  updatedModels.add(model);
  model.ordinal = list.length -
      checkedOrdinal -
      (checkedOrdinal > initialOrdinal ? 0 : 1);

  return Future.wait(
    updatedModels.map((e) => updateModel(e, databaseName: databaseName)),
  );
}