Skip to content

Instantly share code, notes, and snippets.

@dustinlacewell-wk
Last active December 17, 2017 06:52
Show Gist options
  • Save dustinlacewell-wk/2ded4ce39dbf7bb65b7ac1208e96a7a3 to your computer and use it in GitHub Desktop.
Save dustinlacewell-wk/2ded4ce39dbf7bb65b7ac1208e96a7a3 to your computer and use it in GitHub Desktop.
#!/usr/bin/env fsharpi
#I "../../../.nuget/packages/hopac/0.3.21/lib/net45/"
#I "../../../.nuget/packages/hopac.extras/0.3.1/lib/net45"
#r "Hopac.Extras"
#r "Hopac.Platform"
#r "Hopac.Core"
#r "Hopac"
open System
open System.Collections.Generic
open Hopac.Job
open Hopac
open Hopac.Infixes
open Hopac.Extensions
[<Sealed>]
type Condition() =
let mutable subs: IVar<unit> list = []
member this.wait () =
let v = IVar<unit> ()
subs <- (List.rev subs) |> fun x -> v :: x |> List.rev
IVar.read v
member this.signal () =
if subs.Length > 0 then
for v in subs do
start (IVar.fill v ())
subs <- []
let c = Condition()
let q = Condition()
let bg i = job {
do printfn "client %i ..." i
do! c.wait()
do printfn "client %i <==" i
do printfn "client %i==>" i
do q.signal()
}
start (conIgnore [ for i in [1..3] do yield bg i])
run (delay (fun _ -> job {
do printfn "server ..."
do! timeOut (TimeSpan.FromSeconds 2.0)
do printfn "server ==>"
do c.signal()
do printfn "server ..."
do! q.wait()
do printfn "server <=="
}))
./channel-test.fsx
server ...
client 2 ...
client 1 ...
client 3 ...
server ==>
server ...
client 3 <==
client 2 <==
client 1 <==
client 3==>
client 2==>
client 1==>
server <==
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment