1unitedpower: Projektvorstellung: MVar - low-level Bibliothek für Nebenläufigkeit

Beitrag lesen

problematische Seite

So, ich hab jetzt eine neue Version gepusht, die schedule-Methode entspricht in etwa deiner enqueueOrPerformAction-Methode.

Ich habe den internen Typen der Task-Queue auf () => void fixiert. Am Beispiel von take sieht das nun so aus:

class MVar<a> {
  // ...

  private taskQueue: Array<() => void>

  private schedule (task: () => a): Promise<a> {
    return new Promise(resolve => {
      if (this.putQueue.length > 0) {
        resolve(task())
      } else {
        this.taskQueue.push(() => resolve(task()))
      }
    })
  }

  private runTake (): a {
    return this.putQueue.shift()!
  }

  public take (): Promise<a> {
    return this.schedule(() => this.runTake())
  }

  public tryTake (): a {
    if (this.putQueue.length !== 0) {
      return this.runTake()
    } else {
      throw new MVarEmptyError()
    }
  }
}

Damit ist der Code jetzt auch DRY. Als kleiner Nebeneffekt ist das UMD-Build jetzt auch nur noch 1.08KB statt 1.12KB groß. Ein Nachteil ist, dass ich jetzt Thunks allozieren muss, das dürfte einen kleinen Runtime-Overhead bedeuten, aber das nehme ich in Kauf.