forked from Cutlery/immich
		
	* feature(mobile): sync assets, albums & users to local database on device * try to fix tests * move DB sync operations to new SyncService * clear db on user logout * fix reason for endless loading timeline * fix error when deleting album * fix thumbnail of device albums * add a few comments * fix Hive box not open in album service when loading local assets * adjust tests to int IDs * fix bug: show all albums when Recent is selected * update generated api * reworked Recents album isAll handling * guard against wrongly interleaved sync operations * fix: timeline asset ordering (sort asset state by created at) * fix: sort assets in albums by created at
		
			
				
	
	
		
			72 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'dart:async';
 | 
						|
 | 
						|
/// Efficiently compares two sorted lists in O(n), calling the given callback
 | 
						|
/// for each item.
 | 
						|
/// Return `true` if there are any differences found, else `false`
 | 
						|
Future<bool> diffSortedLists<A, B>(
 | 
						|
  List<A> la,
 | 
						|
  List<B> lb, {
 | 
						|
  required int Function(A a, B b) compare,
 | 
						|
  required FutureOr<bool> Function(A a, B b) both,
 | 
						|
  required FutureOr<void> Function(A a) onlyFirst,
 | 
						|
  required FutureOr<void> Function(B b) onlySecond,
 | 
						|
}) async {
 | 
						|
  bool diff = false;
 | 
						|
  int i = 0, j = 0;
 | 
						|
  for (; i < la.length && j < lb.length;) {
 | 
						|
    final int order = compare(la[i], lb[j]);
 | 
						|
    if (order == 0) {
 | 
						|
      diff |= await both(la[i++], lb[j++]);
 | 
						|
    } else if (order < 0) {
 | 
						|
      await onlyFirst(la[i++]);
 | 
						|
      diff = true;
 | 
						|
    } else if (order > 0) {
 | 
						|
      await onlySecond(lb[j++]);
 | 
						|
      diff = true;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  diff |= i < la.length || j < lb.length;
 | 
						|
  for (; i < la.length; i++) {
 | 
						|
    await onlyFirst(la[i]);
 | 
						|
  }
 | 
						|
  for (; j < lb.length; j++) {
 | 
						|
    await onlySecond(lb[j]);
 | 
						|
  }
 | 
						|
  return diff;
 | 
						|
}
 | 
						|
 | 
						|
/// Efficiently compares two sorted lists in O(n), calling the given callback
 | 
						|
/// for each item.
 | 
						|
/// Return `true` if there are any differences found, else `false`
 | 
						|
bool diffSortedListsSync<A, B>(
 | 
						|
  List<A> la,
 | 
						|
  List<B> lb, {
 | 
						|
  required int Function(A a, B b) compare,
 | 
						|
  required bool Function(A a, B b) both,
 | 
						|
  required void Function(A a) onlyFirst,
 | 
						|
  required void Function(B b) onlySecond,
 | 
						|
}) {
 | 
						|
  bool diff = false;
 | 
						|
  int i = 0, j = 0;
 | 
						|
  for (; i < la.length && j < lb.length;) {
 | 
						|
    final int order = compare(la[i], lb[j]);
 | 
						|
    if (order == 0) {
 | 
						|
      diff |= both(la[i++], lb[j++]);
 | 
						|
    } else if (order < 0) {
 | 
						|
      onlyFirst(la[i++]);
 | 
						|
      diff = true;
 | 
						|
    } else if (order > 0) {
 | 
						|
      onlySecond(lb[j++]);
 | 
						|
      diff = true;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  diff |= i < la.length || j < lb.length;
 | 
						|
  for (; i < la.length; i++) {
 | 
						|
    onlyFirst(la[i]);
 | 
						|
  }
 | 
						|
  for (; j < lb.length; j++) {
 | 
						|
    onlySecond(lb[j]);
 | 
						|
  }
 | 
						|
  return diff;
 | 
						|
}
 |