import { MonoTypeOperatorFunction } from 'rxjs'; import { ISortedChangeSet } from '../ISortedChangeSet'; import { IChangeSet } from '../IChangeSet'; import { Change } from '../Change'; import { map } from 'rxjs/operators'; import { SortedChangeSet } from '../SortedChangeSet'; /** * Converts moves changes to remove + add * @typeparam TObject The type of the object. * @typeparam TKey The type of the key. */ export function treatMovesAsRemoveAdd(): MonoTypeOperatorFunction> { function* replaceMoves(items: IChangeSet): Iterable> { for (const change of items) { if (change.reason === 'moved') { yield new Change('remove', change.key, change.current, change.previousIndex); yield new Change('add', change.key, change.current, change.currentIndex); } else { yield change; } } } return function treatMovesAsRemoveAddOperator(source) { return source.pipe(map(changes => new SortedChangeSet(changes.sortedItems, replaceMoves(changes)))); }; }