functor RQUEUE( type Item ):QueueSig = struct exception Deq type Item = Item abstype Queue = Q of (Item list * Item list) ref with val empty = Q (ref ([], [])) fun isEmpty(Q (ref([], []))) = true | isEmpty _ = false fun enq(Q(ref (inp, out)), e) = Q(ref(e :: inp, out)) fun deq(Q(ref(inp, h :: t))) = (Q(ref(inp, t)), h) | deq(Q(ref([], []))) = raise Deq | deq(Q(r as ref(inp, []))) = (r := ([], rev inp); deq(Q r)) end end;