let ( let+ ) x f = `Let (x, f)

let ( and+ ) a b = `And (a, b)

let t =
  let+ x = 1 and+ y = 2 and+ z = 3 in
  (x, y, z)

let () =
  match t with
  | `Let (`And (`And (1, 2), 3), f) -> assert (f ((1, 2), 3) = (1, 2, 3))
  | _ -> assert false

(* Make sure the evaluation order is the same as with OCaml >= 4.08 *)

let ( let+ ) x f = f x

let ( and+ ) a b = (a, b)

let () =
  let q1 = Queue.create () in
  let q2 = Queue.create () in
  let () = Queue.add 1 q1 and () = Queue.add 2 q1 and () = Queue.add 3 q1 in
  let+ () = Queue.add 1 q2 and+ () = Queue.add 2 q2 and+ () = Queue.add 3 q2 in
  let l1 = Queue.fold (fun l x -> x :: l) [] q1 in
  let l2 = Queue.fold (fun l x -> x :: l) [] q2 in
  assert (l1 = l2)
