Re: Ehud Shapiro's promise based Queue in the browser
Mark Miller <[email protected]>
| Newsgroups | gmane.comp.lang.e.general |
|---|---|
| Message-ID | <[email protected]> |
On Fri, May 8, 2009 at 3:57 PM, Tyler Close <[email protected]> wrote: > To test my web_send promise implementation, I made an AJAX interface > to the weird promise based Queue implementation that supports popping > values before they've been added. [...] For reference, at src/esrc/org/erights/e/examples/concurrency/makeQueue.emaker in the E distribution contains an E implementation of this idea together with a bit of updoc: --------------------- #!/usr/bin/env rune pragma.syntax("0.8") # Copyright 2002 Combex, Inc. under the terms of the MIT X license # found at http://www.opensource.org/licenses/mit-license.html ................ /** * */ def makeQueue() :near { def [var qhead, var qtail] := Ref.promise() def cons(elem, next) :near { def pair { to getElem() :any { return elem } to getNext() :any { return next } } return pair } def enqueue(elem) :void { def [nextHead, nextTail] := Ref.promise() qtail.resolve(cons(elem, nextHead)) qtail := nextTail } def dequeue() :any { def result := qhead <- getElem() qhead := qhead <- getNext() return result } return [enqueue, dequeue] } ? pragma.syntax("0.8") ? def makeQueue := <import:org.erights.e.examples.concurrency.makeQueue> # value: <makeQueue> ? def [enq, deq] := makeQueue() # value: [<enqueue>, <dequeue>] ? enq(3) ? def x := deq() # value: <Promise> # Wait a moment ? x # value: 3 ? def y := deq() # value: <Promise> # Wait a moment ? y # value: <Promise> # Yup, still unresolved # Messages to promises build up future dependency chains in a natural way: ? def z := y <- add(7) # value: <Promise> ? enq(4) # Wait a moment ? y # value: 4 ? z # value: 11