insert-full.mz
mutable data fifo a = | Empty { head: (); tail: () } | NonEmpty { head: dynamic; tail: dynamic } adopts cell a mutable data cell a = | Cell { contents: a; next: dynamic } (* Insert [x] into [f]. *) val insert [a] (consumes x: a, f: fifo a): () = let c = Cell { contents = x; next = () } in c.next <- c; give c to f; match f with | Empty -> tag of f <- NonEmpty; f.head <- c; f.tail <- c | NonEmpty { tail } -> take tail from f; tail.next <- c; give tail to f; f.tail <- c end