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.