You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

53 lines
1.6 KiB

import type { DatasetChanges } from "@ldo/rdf-utils";
import type { BaseQuad } from "@rdfjs/types";
/**
* Merges a new change into an original change
* @param originalChange
* @param newChange
*/
export function mergeDatasetChanges<InAndOutQuad extends BaseQuad>(
originalChange: DatasetChanges<InAndOutQuad>,
newChange: DatasetChanges<InAndOutQuad>,
): void {
// Add added
if (newChange.added) {
if (originalChange.added) {
originalChange.added.addAll(newChange.added);
} else {
originalChange.added = newChange.added;
}
// Delete from removed if present
const changesIntersection = originalChange.removed?.intersection(
newChange.added,
);
if (changesIntersection && changesIntersection.size > 0) {
originalChange.removed =
originalChange.removed?.difference(changesIntersection);
}
}
// Add removed
if (newChange.removed) {
if (originalChange.removed) {
originalChange.removed.addAll(newChange.removed);
} else {
originalChange.removed = newChange.removed;
}
// Delete from added if present
const changesIntersection = originalChange.added?.intersection(
newChange.removed,
);
if (changesIntersection && changesIntersection.size > 0) {
originalChange.added =
originalChange.added?.difference(changesIntersection);
}
}
// Make undefined if size is zero
if (originalChange.added && originalChange.added.size === 0) {
originalChange.added = undefined;
}
if (originalChange.removed && originalChange.removed.size === 0) {
originalChange.removed = undefined;
}
}