type 'a queue = ('a list * 'a list) let empty = ([], []) let put a (q1, q2) = (q1, a :: q2) let rec get = function | ([], []) as q -> (None, q) | (a :: q1, q2) -> (Some a, (q1, q2)) | ([], q2) -> get (List.rev q2, []) let ( >> ) x f = f x let q = empty >> put 1 >> put 2 >> put 3 let (Some v1, q) = get q ;; print_int v1 let (Some v2, q) = get q ;; print_int v2 let (Some v3, q) = get q ;; print_int v3