-
Notifications
You must be signed in to change notification settings - Fork 9
/
Async.fs
26 lines (22 loc) · 1.05 KB
/
Async.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// ----------------------------------------------------------------------------
// F# async extensions (AsyncSeq.fs)
// (c) Tomas Petricek, 2011, Available under Apache 2.0 license.
// ----------------------------------------------------------------------------
namespace FSharp.Control
// ----------------------------------------------------------------------------
[<AutoOpen>]
module AsyncExtensions =
type Microsoft.FSharp.Control.Async with
/// Creates an asynchronous workflow that runs the asynchronous workflow
/// given as an argument at most once. When the returned workflow is
/// started for the second time, it reuses the result of the
/// previous execution.
static member Cache (input:Async<'T>) =
let agent = Agent<AsyncReplyChannel<_>>.Start(fun agent -> async {
let! repl = agent.Receive()
let! res = input
repl.Reply(res)
while true do
let! repl = agent.Receive()
repl.Reply(res) })
async { return! agent.PostAndAsyncReply(id) }