MVarallows you to do both at once
Refas something that could deal with concurrent state only
Deferredis very simple: starts empty, becomes full, can't be emptied or modified again.
geton empty waits (asyncly), get on full immediately returns.
completeon empty unblocks the readers,
completeon full fails
MVargives a lot more ways to end up in deadlock
I imagine if all
worker#1 -> mvar.put(1) worker#2 -> mvar.put(2) … worker#n -> mvar.put(n) // they all block asyncly if mvar is non-empty // clients reading forever client#1 -> mvar.take client#2 -> mvar.take … client#n -> mvar.take
clients share the same
mvarinstance we get something that looks like a queue