export const cancelable_timeout = (callback, lapse) => {
  let canceled = false
  setTimeout(() => {
    if (!canceled) {
      callback()
    }
  }, lapse)
  return {
    cancel: () => {
      canceled = true
    },
  }
}

export const cancelable_promise = (constructor) => {
  let canceled = false
  return {
    promise: new Promise((resolve, reject) => {
      let promise = new Promise(constructor)
      promise.then((data) => canceled ? reject({error: "canceled", data}) : resolve(data))
      promise.catch((data) => canceled ? reject({error: "canceled", data}) : reject(data))
    }),
    cancel: () => {
      canceled = true
    },
  }
}
