1) p = new Promise() creates a new promise2) p.value <- val assigns val as the value of the promise3) p.value returns the value of the promise, or blocks the thread if nobody assigned a value yet
class Promise<T> { private T _value; private handle; public Promise() { handle = new ManualResetEvent(false) } public T value { get { handle.WaitOne(); return _value } set { _value = value; handle.Set() } }}
download :: string -> Promise<Stream>download url = let p = new Promise() let req = HttpWebRequest.Create(url) req.BeginGetResponse(res => p.value <- res) // ommited boilerplate to extract the stream here p
let page1 = download "foo.com" let page2 = download "bar.com" print page1.value print page2.value
simple value: basync value: Async<b> = (b -> ()) -> () // (b -> ()) is the callback
async :: Async<b> -> Promise<b>async ayncval = let p = new Promise() asyncval (val => p.value <- val) p
download url = async HttpWebRequest.Create(url).BeginGetResponse
download url = async (callback => HttpWebRequest.Create(url).BeginGetResponse(callback))