open Okasaki open QueueSig module BatchedQueue : Queue = struct type 'a queue = 'a list * 'a list let empty : 'a queue = ([],[]) let is_empty = function | [],_ -> true | _ -> false let checkf = function | [],r -> (List.rev r, []) | q -> q let snoc (f,r) x = checkf (f, x::r) let head = function | [], _ -> raise EmptyStructure | x::f, r -> x let tail = function | [], _ -> raise EmptyStructure | x::f, r -> checkf (f,r) end |