@constructorfleet/ultimate-govee
Version:
Library for interacting with Govee devices written in Typescript.
158 lines • 5.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.processDelta = exports.tapDelta = exports.mapDelta = exports.filterDelta = exports.startDelta = exports.processElements = exports.mapForEach = void 0;
/* eslint-disable func-names */
const rxjs_1 = require("rxjs");
const delta_set_observable_1 = require("./delta-set.observable");
function mapForEach(map, fn) {
if (fn) {
Array.from(map.values()).forEach((entry) => fn(entry));
}
}
exports.mapForEach = mapForEach;
function processElements(delta, handlerFunctions) {
mapForEach(delta.deleted, handlerFunctions.delete);
mapForEach(delta.modified, handlerFunctions.modify);
mapForEach(delta.added, handlerFunctions.add);
}
exports.processElements = processElements;
function startDelta() {
let started = false;
return (0, rxjs_1.map)((delta) => {
if (!started) {
// first pass, we add all elements to added for correct initial state
delta = {
all: delta.all,
added: delta.all,
deleted: new Map(),
modified: new Map(),
};
started = true;
}
return delta;
});
}
exports.startDelta = startDelta;
function filterDelta(filterFunction) {
const filterSet = new delta_set_observable_1.DeltaSet();
filterSet.pauseDelta();
return function (source) {
return new rxjs_1.Observable((subscriber) => {
const subscription = source.subscribe({
next(delta) {
if (delta.all.size === 0) {
// optimization for empty source map
filterSet.clear();
}
else {
filterEntries(delta.modified);
filterEntries(delta.added);
deleteEntries(delta.deleted);
}
const newDelta = filterSet.getDelta();
filterSet.clearDelta();
if (newDelta.added.size > 0 ||
newDelta.modified.size > 0 ||
newDelta.deleted.size > 0) {
subscriber.next(newDelta);
}
},
error(error) {
subscriber.error(error);
},
complete() {
subscriber.complete();
},
});
return () => subscription.unsubscribe();
});
};
function filterEntries(set) {
Array.from(set.values()).forEach((entry) => {
if (filterFunction(entry)) {
filterSet.add(entry);
}
else {
filterSet.delete(entry.id);
}
});
}
function deleteEntries(set) {
Array.from(set.values()).forEach((entry) => filterSet.delete(entry.id));
}
}
exports.filterDelta = filterDelta;
function mapDelta(mappingFunction) {
const mapSet = new delta_set_observable_1.DeltaSet();
mapSet.pauseDelta();
return (0, rxjs_1.map)((delta) => {
if (delta.all.size === 0) {
// optimization for empty source map
mapSet.clear();
}
else {
mapEntries(delta.modified);
mapEntries(delta.added);
deleteEntries(delta.deleted);
}
const newDelta = mapSet.getDelta();
mapSet.clearDelta();
return newDelta;
});
function mapEntries(set) {
Array.from(set.values()).forEach((entry) => mapSet.add(mappingFunction(entry)));
}
function deleteEntries(set) {
Array.from(set.values()).forEach((entry) => mapSet.delete(mappingFunction(entry).id));
}
}
exports.mapDelta = mapDelta;
function tapDelta(handlerFunctions) {
return (0, rxjs_1.tap)((delta) => {
if (handlerFunctions.before) {
handlerFunctions.before();
}
mapForEach(delta.deleted, handlerFunctions.delete);
mapForEach(delta.modified, handlerFunctions.modify);
mapForEach(delta.added, handlerFunctions.add);
if (handlerFunctions.after) {
handlerFunctions.after();
}
return delta;
});
}
exports.tapDelta = tapDelta;
function processDelta(handlerFunctions) {
let started = false;
return (0, rxjs_1.map)((delta) => {
if (!started) {
// first pass, we add all elements to added for correct initial state
delta = {
all: delta.all,
added: delta.all,
deleted: new Map(),
modified: new Map(),
};
started = true;
}
if (handlerFunctions) {
if (handlerFunctions.before) {
handlerFunctions.before(delta);
}
handleEntries(delta.deleted, handlerFunctions.delete);
handleEntries(delta.modified, handlerFunctions.modify);
handleEntries(delta.added, handlerFunctions.add);
if (handlerFunctions.after) {
handlerFunctions.after(delta);
}
}
return delta;
});
function handleEntries(set, fn) {
if (fn) {
Array.from(set.values()).forEach((entry) => fn(entry));
}
}
}
exports.processDelta = processDelta;
//# sourceMappingURL=operators.js.map