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