open Okasaki
open Stream
open QueueSig
module BankersQueue : Queue =
struct
type 'a queue = int * 'a stream * int * 'a stream
let empty : 'a queue = (0, lazy Nil, 0, lazy Nil)
let is_empty : 'a queue -> bool = fun (lenf, _, _, _) -> (lenf = 0)
let check ((lenf,f,lenr,r) as q) =
if lenr <= lenf then q else (lenf + lenr, f ++ reverse r, 0, lazy Nil)
let snoc (lenf,f,lenr,r) x =
check (lenf, f, lenr+1, lazy (Cons (x,r)))
let head = function
| (lenf,lazy Nil,lenr,r) -> raise EmptyStructure
| (lenf,lazy (Cons(x,_)),lenr,r) -> x
let tail = function
| (lenf,lazy Nil,lenr,r) -> raise EmptyStructure
| (lenf,lazy (Cons(x,f')),lenr,r) -> check (lenf-1,f',lenr,r)
end
|