open Okasaki open Stream open QueueSig module RealTimeQueue : Queue = struct type 'a queue = 'a stream * 'a list * 'a stream let empty : 'a queue = (lazy Nil ,[], lazy Nil) let is_empty : 'a queue -> bool = function | lazy Nil, _, _ -> true | _ -> false let rec rotate : 'a queue -> 'a stream = function | lazy Nil, y::_, a -> lazy (Cons (y,a)) | lazy (Cons(x,xs)), y::ys, a -> lazy (Cons (x, rotate (xs, ys, lazy (Cons (y,a))))) | _ -> raise BrokenInvariant let exec : 'a queue -> 'a queue = function | f, r, lazy (Cons (x,s)) -> (f,r,s) | f, r, lazy Nil -> let f' = rotate (f,r,lazy Nil) in (f',[],f') let snoc : 'a queue -> 'a -> 'a queue = fun (f,r,s) x -> exec (f, x::r, s) let head : 'a queue -> 'a = function | lazy Nil, r, s -> raise EmptyStructure | lazy (Cons (x,f)), r, s -> x let tail : 'a queue -> 'a queue = function | lazy Nil, r, s -> raise EmptyStructure | lazy (Cons (x,f)), r, s -> exec (f,r,s) end |