(* buffer.sml *) (* CML buffers of length at most one *) structure Buffer :> BUFFER = struct open CML type 'a buffer = {addCh : 'a chan, (* values sent to this channel will be added to buffer *) delCh : 'a chan} (* values read from this channel will be deleted from buffer *) (* val server : 'a buffer -> 'b *) fun server{addCh, delCh} = let (* val empty : unit -> 'b *) fun empty() = full(recv addCh) (* val full : 'a -> 'b *) and full x = (send(delCh, x); empty()) in empty() end fun make() = let val buf = {addCh = channel(), delCh = channel()} in spawn(fn () => server buf); buf end fun add({addCh, ...} : 'a buffer, x) = send(addCh, x) fun del({delCh, ...} : 'a buffer) = recv delCh end;