<div dir="ltr">Hi Richard,<div><br></div><div>The isEmpty is not out of date as STM will detect if it is and restart the transaction.  The take operation will block if the bag is empty.  If this isn't clear in the documentation we should make it clearer.  You can write a maybeTake using orElse:</div><div><br></div><div>  maybeTake b = (Just <$> take b) `orElse` return Nothing</div><div><br></div><div>Ryan</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 22, 2015 at 8:27 PM, Richard A. O'Keefe <span dir="ltr"><<a href="mailto:ok@cs.otago.ac.nz" target="_blank">ok@cs.otago.ac.nz</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I'm really puzzled by the interface.<br>
<br>
class Bag b<br>
  where<br>
    new :: STM (b v)<br>
      -- no problem here<br>
    add :: b v -> v -> STM ()<br>
      -- no problem here<br>
    isEmpty :: b v -> STM Bool<br>
      -- no real problem except the pervasive one that whatever<br>
      -- you learn about the state of a concurrent object must<br>
      -- always be treated as out of date when you use it<br>
    take :: b v -> STM v<br>
      -- what is supposed to happen if the bag is empty?<br>
<br>
I was expecting an operation like<br>
<br>
    maybeTake :: b v -> STM (Maybe v)<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br></div>