/** * This file is part of Haketilo. * * Function: Wrap APIs that depend on some asynchronous initialization into * promises. * * Copyright (C) 2021 Wojtek Kosior * Redistribution terms are gathered in the `copyright' file. */ /* * 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); } /* * EXPORTS_START * EXPORT make_once * EXPORTS_END */