/** * Myext feature initialization promise * * Copyright (C) 2021 Wojtek Kosior * * This code is dual-licensed under: * - Asshole license 1.0, * - GPLv3 or (at your option) any later version * * "dual-licensed" means you can choose the license you prefer. * * This code is released under a permissive license because I disapprove of * copyright and wouldn't be willing to sue a violator. Despite not putting * this code under copyleft (which is also kind of copyright), I do not want * it to be made proprietary. Hence, the permissive alternative to GPL is the * Asshole license 1.0 that allows me to call you an asshole if you use it. * This means you're legally ok regardless of how you utilize this code but if * you make it into something nonfree, you're an asshole. * * You should have received a copy of both GPLv3 and Asshole license 1.0 * together with this code. If not, please see: * - https://www.gnu.org/licenses/gpl-3.0.en.html * - https://koszko.org/asshole-license.txt */ "use strict"; /* * This module provides an easy way to wrap an async function into a promise * so that it only gets executed once. */ (() => { async function assign_result(state, result_producer) { state.result = await result_producer(); state.ready = true; for (let cb of state.waiting) setTimeout(cb, 0, state.result); state.waiting = undefined; } async function get_result(state) { if (state.ready) return state.result; return new Promise((resolve, reject) => state.waiting.push(resolve)); } function make_once(result_producer) { let state = {waiting : [], ready : false, result : undefined}; assign_result(state, result_producer); return () => get_result(state); } window.make_once = make_once; })();