function debounce(func, wait_ms, immediate) {
		let timeout;
		const debounced_func = function () {
			const context = this;
			const args = arguments;

			const later = () => {
				timeout = null;
				if (!immediate) {
					func.apply(context, args);
				}
			};

			const callNow = immediate && !timeout;

			clearTimeout(timeout);

			timeout = setTimeout(later, wait_ms);

			if (callNow) {
				func.apply(context, args);
			}
		};
		debounced_func.cancel = () => {
			clearTimeout(timeout);
		};
		return debounced_func;
	}
Returns a function, that, as long as it continues to be invoked, will not
	be triggered. The function will be called after it stops being called for
	N milliseconds. If `immediate` is passed, trigger the function on the
	leading edge, instead of the trailing.