/* Simple asynchronous queue.
To make `get` blocking, we create a new promise and store its `resolve` function in `resolvers`.
The next time an item is added to the queue, it will be resolved.
*/

export default function() {
    return {
        items: [],

        resolvers: [],

        put(item) {
            this.items.push(item);
            let resolver = this.resolvers.shift();
            if (resolver) {
                resolver();
            }
        },

        async get() {
            if (this.items.length === 0) {
                await new Promise((resolve, reject) => {
                    this.resolvers.push(resolve);
                })
            }
            
            return this.items.shift();
        },
    }
}