open Okasaki open Stream open QueueSig module PhysicistsQueue : Queue = struct type 'a queue = 'a list * int * 'a list Lazy.t * int * 'a list let empty : 'a queue = ([], 0, lazy [], 0, []) let is_empty : 'a queue -> bool = fun (_, lenf, _, _, _) -> (lenf = 0) let checkw = function | [], lenf, f, lenr, r -> !$f, lenf, f, lenr, r | q -> q let check (w, lenf, f, lenr, r as q) = if lenr <= lenf then checkw q else let f' = !$f in checkw (f', lenf+lenr, lazy (f' @ List.rev r), 0, []) let snoc (w, lenf, f, lenr, r) x = check (w, lenf, f, lenr+1, x::r) let head = function | [], lenf, f, lenr, r -> raise EmptyStructure | x::w, lenf, f, lenr, r -> x let tail = function | [], lenf, f, lenr, r -> raise EmptyStructure | x::w, lenf, f, lenr, r -> check (w, lenf-1, lazy (List.tl !$f), lenr, r) end |