class UtilityService {
    constructor() {
        this._debounce_timeouts = {}
    }

    uuid() {
        return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
            (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
        )
    }

    debounce(handler = () => {}, delay = 500) {
        let timeout = null

        return (...args) => {
            clearTimeout(timeout)

            timeout = setTimeout(() => {
                handler(...args)
            }, delay)
        }
    }
}

const utility = new UtilityService()
export { utility }
