'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var tslib = require('tslib'); var index = require('../resize/index.cjs.js'); var info = require('./info.cjs.js'); var onScrollHandler = require('./on-scroll-handler.cjs.js'); const scrollListeners = new WeakMap(); const resizeListeners = new WeakMap(); const onScrollHandlers = new WeakMap(); const getEventTarget = (element) => element === document.documentElement ? window : element; function scroll(onScroll, _a = {}) { var { container = document.documentElement } = _a, options = tslib.__rest(_a, ["container"]); let containerHandlers = onScrollHandlers.get(container); /** * Get the onScroll handlers for this container. * If one isn't found, create a new one. */ if (!containerHandlers) { containerHandlers = new Set(); onScrollHandlers.set(container, containerHandlers); } /** * Create a new onScroll handler for the provided callback. */ const info$1 = info.createScrollInfo(); const containerHandler = onScrollHandler.createOnScrollHandler(container, onScroll, info$1, options); containerHandlers.add(containerHandler); /** * Check if there's a scroll event listener for this container. * If not, create one. */ if (!scrollListeners.has(container)) { const listener = () => { const time = performance.now(); for (const handler of containerHandlers) handler.measure(); for (const handler of containerHandlers) handler.update(time); for (const handler of containerHandlers) handler.notify(); }; scrollListeners.set(container, listener); const target = getEventTarget(container); window.addEventListener("resize", listener, { passive: true }); if (container !== document.documentElement) { resizeListeners.set(container, index.resize(container, listener)); } target.addEventListener("scroll", listener, { passive: true }); } const listener = scrollListeners.get(container); const onLoadProcesss = requestAnimationFrame(listener); return () => { var _a; if (typeof onScroll !== "function") onScroll.stop(); cancelAnimationFrame(onLoadProcesss); /** * Check if we even have any handlers for this container. */ const containerHandlers = onScrollHandlers.get(container); if (!containerHandlers) return; containerHandlers.delete(containerHandler); if (containerHandlers.size) return; /** * If no more handlers, remove the scroll listener too. */ const listener = scrollListeners.get(container); scrollListeners.delete(container); if (listener) { getEventTarget(container).removeEventListener("scroll", listener); (_a = resizeListeners.get(container)) === null || _a === void 0 ? void 0 : _a(); window.removeEventListener("resize", listener); } }; } exports.scroll = scroll;