{"version":3,"file":"utils.min.js","sources":["https:\/\/inclusivemediatraining.eu\/lib\/amd\/src\/utils.js"],"sourcesContent":["\/\/ This file is part of Moodle - http:\/\/moodle.org\/\n\/\/\n\/\/ Moodle is free software: you can redistribute it and\/or modify\n\/\/ it under the terms of the GNU General Public License as published by\n\/\/ the Free Software Foundation, either version 3 of the License, or\n\/\/ (at your option) any later version.\n\/\/\n\/\/ Moodle is distributed in the hope that it will be useful,\n\/\/ but WITHOUT ANY WARRANTY; without even the implied warranty of\n\/\/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\/\/ GNU General Public License for more details.\n\/\/\n\/\/ You should have received a copy of the GNU General Public License\n\/\/ along with Moodle. If not, see .\n\n\/**\n * Utility functions.\n *\n * @module core\/utils\n * @copyright 2019 Ryan Wyllie \n * @license http:\/\/www.gnu.org\/copyleft\/gpl.html GNU GPL v3 or later\n *\/\nimport Pending from 'core\/pending';\n\n \/**\n * Create a wrapper function to throttle the execution of the given\n *\n * function to at most once every specified period.\n *\n * If the function is attempted to be executed while it's in cooldown\n * (during the wait period) then it'll immediately execute again as\n * soon as the cooldown is over.\n *\n * @method\n * @param {Function} func The function to throttle\n * @param {Number} wait The number of milliseconds to wait between executions\n * @return {Function}\n *\/\nexport const throttle = (func, wait) => {\n let onCooldown = false;\n let runAgain = null;\n const run = function(...args) {\n if (runAgain === null) {\n \/\/ This is the first time the function has been called.\n runAgain = false;\n } else {\n \/\/ This function has been called a second time during the wait period\n \/\/ so re-run it once the wait period is over.\n runAgain = true;\n }\n\n if (onCooldown) {\n \/\/ Function has already run for this wait period.\n return;\n }\n\n func.apply(this, args);\n onCooldown = true;\n\n setTimeout(() => {\n const recurse = runAgain;\n onCooldown = false;\n runAgain = null;\n\n if (recurse) {\n run(args);\n }\n }, wait);\n };\n\n return run;\n};\n\n\/**\n * @property {Map} debounceMap A map of functions to their debounced pending promises.\n *\/\nconst debounceMap = new Map();\n\n\/**\n * Create a wrapper function to debounce the execution of the given\n * function. Each attempt to execute the function will reset the cooldown\n * period.\n *\n * @method\n * @param {Function} func The function to debounce\n * @param {Number} wait The number of milliseconds to wait after the final attempt to execute\n * @param {Object} [options]\n * @param {boolean} [options.pending=false] Whether to wrap the debounced method in a pending promise\n * @param {boolean} [options.cancel=false] Whether to add a cancel method to the debounced function\n * @return {Function}\n *\/\nexport const debounce = (\n func,\n wait,\n {\n pending = false,\n cancel = false,\n } = {},\n) => {\n let timeout = null;\n\n const returnedFunction = (...args) => {\n if (pending && !debounceMap.has(returnedFunction)) {\n debounceMap.set(returnedFunction, new Pending('core\/utils:debounce'));\n }\n clearTimeout(timeout);\n timeout = setTimeout(async() => {\n \/\/ Get the current pending promise and immediately empty it.\n \/\/ This is important to allow the function to be debounced again as soon as possible.\n \/\/ We do not resolve it until later - but that's fine because the promise is appropriately scoped.\n const pendingPromise = debounceMap.get(returnedFunction);\n debounceMap.delete(returnedFunction);\n\n \/\/ Allow the debounced function to return a Promise.\n \/\/ This ensures that Behat will not continue until the function has finished executing.\n await func.apply(this, args);\n\n \/\/ Resolve the pending promise if it exists.\n pendingPromise?.resolve();\n }, wait);\n };\n\n if (cancel) {\n returnedFunction.cancel = () => {\n const pendingPromise = debounceMap.get(returnedFunction);\n pendingPromise?.resolve();\n clearTimeout(timeout);\n };\n }\n\n return returnedFunction;\n};\n"],"names":["func","wait","onCooldown","runAgain","run","args","apply","this","setTimeout","recurse","debounceMap","Map","pending","cancel","timeout","returnedFunction","has","set","Pending","clearTimeout","async","pendingPromise","get","delete","resolve"],"mappings":"mQAsCwB,CAACA,KAAMC,YACvBC,YAAa,EACbC,SAAW,WACTC,IAAM,yCAAYC,6CAAAA,2BAGhBF,SAFa,OAAbA,SASAD,aAKJF,KAAKM,MAAMC,KAAMF,MACjBH,YAAa,EAEbM,YAAW,WACDC,QAAUN,SAChBD,YAAa,EACbC,SAAW,KAEPM,SACAL,IAAIC,QAETJ,eAGAG,WAMLM,YAAc,IAAIC,sBAeA,SACpBX,KACAC,UACAW,QACIA,SAAU,EADdC,OAEIA,QAAS,0DACT,GAEAC,QAAU,WAERC,iBAAmB,0CAAIV,kDAAAA,6BACrBO,UAAYF,YAAYM,IAAID,mBAC5BL,YAAYO,IAAIF,iBAAkB,IAAIG,iBAAQ,wBAElDC,aAAaL,SACbA,QAAUN,YAAWY,gBAIXC,eAAiBX,YAAYY,IAAIP,kBACvCL,YAAYa,OAAOR,wBAIbf,KAAKM,gBAAYD,MAGvBgB,MAAAA,gBAAAA,eAAgBG,YACjBvB,cAGHY,SACAE,iBAAiBF,OAAS,WAChBQ,eAAiBX,YAAYY,IAAIP,kBACvCM,MAAAA,gBAAAA,eAAgBG,UAChBL,aAAaL,WAIdC"}