@ng-doc/builder
Version:
<!-- PROJECT LOGO --> <br /> <div align="center"> <a href="https://github.com/ng-doc/ng-doc"> <img src="https://ng-doc.com/assets/images/ng-doc.svg?raw=true" alt="Logo" height="150px"> </a>
78 lines • 3.3 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.STACK = void 0;
exports.addToStack = addToStack;
exports.whenStackIsEmpty = whenStackIsEmpty;
exports.whenBuildersStackIsEmpty = whenBuildersStackIsEmpty;
exports.afterBuilders = afterBuilders;
const core_1 = require("@ng-doc/core");
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const types_1 = require("../types");
let builderId = 0;
// const BUILDER_STEPS = ['load-entry-files', '']
exports.STACK = new Map();
const STACK_TICK = new rxjs_1.Subject();
/**
*
* @param tag
*/
function addToStack(tag) {
const tagStack = exports.STACK.get(tag) || new Set();
const id = builderId++;
exports.STACK.set(tag, tagStack);
return (source) => {
return source.pipe((0, rxjs_1.tap)({
next: (state) => {
state instanceof types_1.BuilderPending ? tagStack.add(id) : tagStack.delete(id);
// state instanceof BuilderPending
// ? console.log('added:', tag, tagStack.size)
// : console.log('removed:', tag, tagStack.size);
STACK_TICK.next();
},
}), (0, rxjs_1.finalize)(() => {
tagStack.delete(id);
STACK_TICK.next();
}));
};
}
/**
* Operator function that buffers values from the source Observable until the global stack of pending builders is empty.
* When the stack is empty, it emits all buffered values and clears the buffer.
* @param tag
* @template T The type of the source Observable.
* @returns {OperatorFunction<T, T>} An OperatorFunction that can be used with pipe.
*/
function whenStackIsEmpty(tag) {
let buffer = [];
return (source) => {
return source.pipe((0, rxjs_1.tap)((value) => !(0, types_1.isBuilderPending)(value) && buffer.push(value)), (0, rxjs_1.filter)(() => {
const stacks = tag
? tag.map((tag) => exports.STACK.get(tag)).filter(core_1.isPresent)
: [...exports.STACK.values()];
return !stacks.some((stack) => stack.size);
}), (0, rxjs_1.switchMap)(() => (0, rxjs_1.of)(buffer)), (0, rxjs_1.tap)(() => (buffer = [])));
};
}
/**
*
* @param tags
* @param triggers
*/
function whenBuildersStackIsEmpty(tags) {
return (0, rxjs_1.merge)(STACK_TICK).pipe((0, operators_1.debounceTime)(0), (0, rxjs_1.map)(() => {
const stacks = tags
? tags.map((tag) => exports.STACK.get(tag)).filter(core_1.isPresent)
: [...exports.STACK.values()];
return stacks.every((stack) => !stack.size);
}), (0, operators_1.distinctUntilChanged)(), (0, rxjs_1.filter)(Boolean), (0, rxjs_1.map)(() => void 0));
}
/**
*
* @param tags
*/
function afterBuilders(tags) {
const stackChanges = STACK_TICK.pipe((0, rxjs_1.map)(() => (tags ? tags.map((tag) => exports.STACK.get(tag)).filter(core_1.isPresent) : [...exports.STACK.values()])));
return stackChanges.pipe((0, operators_1.debounceTime)(0), (0, rxjs_1.filter)((stacks) => stacks.some((stack) => stack.size)), (0, rxjs_1.switchMap)(() => stackChanges.pipe((0, rxjs_1.filter)((stacks) => !stacks.some((stack) => stack.size)), (0, operators_1.take)(1))), (0, rxjs_1.map)(() => void 0));
}
//# sourceMappingURL=stack.js.map
;