signature QUEUE = sig type 'a queue exception Empty val empty : 'a queue val insert : 'a * 'a queue -> 'a queue val remove : 'a queue -> 'a * 'a queue end structure Queue :> QUEUE = struct type 'a queue = 'a list * 'a list val empty = (nil, nil) fun insert (x, (bs, fs)) = (x::bs, fs) exception Empty fun remove (nil, nil) = raise Empty | remove (bs, f::fs) = (f, (bs, fs)) | remove (bs, nil) = remove (nil, rev bs) end signature PQ = sig type elt val lt : elt * elt -> bool type queue exception Empty val empty : queue val insert : elt * queue -> queue val remove : queue -> elt * queue end signature STRING_PQ = PQ where type elt = string signature ORDERED = sig type t val lt : t * t -> bool end structure IntLt : ORDERED = struct type t = int val lt = (op <) end structure IntDiv : ORDERED = struct type t = int fun lt (m, n) = (n mod m = 0) end