struct

  type t = {
    mutable lwt_t: unit Lwt.t;
    mutable lwt_u: unit Lwt.u;
    mutable color: [`Red | `Green];
  }
  let create () =
    let lwt_t, lwt_u = Lwt.task () in
    {lwt_u; lwt_t; color = `Red}

  let try_to_pass w =
    match w.color with
    | `Green -> return ()
    | `Red ->
      begin match Lwt.state w.lwt_t with
      | Lwt.Sleep -> ()
      | Lwt.Return () | Lwt.Fail _ ->
        (* we need to renew the “task” *)
        let t, u = Lwt.task () in
        w.lwt_t <- t;
        w.lwt_u <- u;
      end;
      wrap_deferred ~on_exn:(fun e -> e) (fun () -> w.lwt_t)
      >>< function
      | `Error Lwt.Canceled -> return ()
      | `Error other -> failwith "BUG: THIS SHOULD NOT HAPPEN"
      | `Ok () -> return ()

  let green t =
    t.color <- `Green;
    Lwt.wakeup_exn t.lwt_u Lwt.Canceled
  (* We use Lwt.Canceled so that can re-wake-up sleepers at will
    see https://github.com/ocsigen/lwt/blob/master/src/core/lwt.ml#L312
    where Lwt.Canceled is ignored *)



end