<div dir="ltr"><div><div>I'm not going to claim canonicity, but I used the type system to encode the socket state machine (see std::io::net::{tcp,udp}).<br></div>TcpListener consumes itself when you start listening and becomes a TcpAcceptor.<br>
</div><div>UdpSocket can "connect" (i.e. ignore messages from other sources) and become a UdpStream, which can "disconnect" (i.e. stop ignoring) and become a UdpSocket again.<br></div><div><br></div>It's actually very easy to do. Make every state a distinct affine type. Implement state transitions as methods that take self by value (consume old state) and return the new state.<br>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jun 4, 2014 at 10:40 PM, Cameron Zwarich <span dir="ltr"><<a href="mailto:zwarich@mozilla.com" target="_blank">zwarich@mozilla.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto"><div>Is there a canonical example of encoding a state machine into Rust's substructural types?<span class="HOEnZb"><font color="#888888"><br>
<br>Cameron</font></span></div><div><div class="h5"><div><br>On Jun 4, 2014, at 10:14 PM, Brian Anderson <<a href="mailto:banderson@mozilla.com" target="_blank">banderson@mozilla.com</a>> wrote:<br><br></div><blockquote type="cite">
<div>
  
    
  
  
    Thank you for your suggestion, but typestate is not coming back.
    There is no room in the complexity budget for another major piece of
    type system, and linear types can serve much the same purpose.<br>
    <br>
    <div>On 06/04/2014 10:11 PM, Suminda
      Dharmasena wrote:<br>
    </div>
    <blockquote type="cite">
      <div dir="ltr">
        <div>Hi,</div>
        <div><br>
        </div>
        <div>The initial Type State implementation in Rust was not a
          great way to get about it. Please reconsider adding type state
          like it has been done in the Plaid language.</div>
        <div>
          <br>
        </div>
        <div>Basically you can use traits mechanism to mixin and remove
          the trait when methods marked as having state transitions.</div>
        <div><br>
        </div>
        <div>Suminda</div>
        <div><br>
        </div>
        <div>Plaid: <a href="http://www.cs.cmu.edu/%7Ealdrich/plaid/" target="_blank">http://www.cs.cmu.edu/~aldrich/plaid/</a><br>
        </div>
      </div>
      <br>
      <fieldset></fieldset>
      <br>
      <pre>_______________________________________________
Rust-dev mailing list
<a href="mailto:Rust-dev@mozilla.org" target="_blank">Rust-dev@mozilla.org</a>
<a href="https://mail.mozilla.org/listinfo/rust-dev" target="_blank">https://mail.mozilla.org/listinfo/rust-dev</a>
</pre>
    </blockquote>
    <br>
  

</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>Rust-dev mailing list</span><br><span><a href="mailto:Rust-dev@mozilla.org" target="_blank">Rust-dev@mozilla.org</a></span><br>
<span><a href="https://mail.mozilla.org/listinfo/rust-dev" target="_blank">https://mail.mozilla.org/listinfo/rust-dev</a></span><br></div></blockquote></div></div></div><br>_______________________________________________<br>

Rust-dev mailing list<br>
<a href="mailto:Rust-dev@mozilla.org">Rust-dev@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/rust-dev" target="_blank">https://mail.mozilla.org/listinfo/rust-dev</a><br>
<br></blockquote></div><br></div>