Hacker News new | ask | show | jobs
by vore 1233 days ago
You might as well avoid wrapping the types and just split the writer and reader: it's good practice to do this anyway, since you probably only need one half of the oneshot channel on each side and having a handle to something that can both read and write seems like a logic error. You can also augment the writer function to throw into the promise, if required!

  type Sender<T, E = unknown> = ((e: null, v: T) => void) & ((e: E) => void);

  function oneshot<T, E = unknown>(): [Promise<T>, Sender<T, E>] {
    let send: Sender<T, E>;
    const recv = new Promise<T>((resolve, reject) => {
        send = (err, v?: T) => err == null ? resolve(v!) : reject(err);
    });
    return [recv, send!];
  }