func NewMon() *ImpMon { // var m mon.Monitor var nR, nW int f := func(a Any, k uint) Any { switch k { case rIn: for nW > 0 { m.Wait(rIn) } nR++ m.Signal(rIn) case rOut: nR-- if nR == 0 { m.Signal(wIn) } case wIn: for nR > 0 || nW > 0 { m.Wait(wIn) } nW = 1 case wOut: nW = 0 if m.Awaited(rIn) { m.Signal(rIn) } else { m.Signal(wIn) } } return nil } m = mon.New(4, f) return &ImpMon{m} }