M?data -> /* receive data */ do :: W!data /* send data */ :: W!shutup; /* or shutdown */ break odis an unfortunate last-minute rewrite of the originally intended version:
do :: M?data -> W!data :: M?data -> W!shutup; break odThe behavior is of course not equivalent. In particular, the version in the book cannot create the error scenario given on page 29, but the intended version can.