UNPKG

@constructorfleet/ultimate-govee

Version:

Library for interacting with Govee devices written in Typescript.

158 lines 5.43 kB
"use strict"; 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