[@@@warning "-8"]

open Riot

type Riot.Message.t +=
  | A of int
  | End
  | Collected_messages of Riot.Message.t list

type state = { messages : Riot.Message.t list; main : Pid.t }

let rec loop state =
  match receive_any ~after:500_000L () with
  | End -> send state.main (Collected_messages (List.rev state.messages))
  | A _ as msg -> loop { state with messages = msg :: state.messages }
  | _ -> loop state

let main () =
  let (Ok _) = Logger.start () in

  let this = self () in
  let pid = spawn (fun () -> loop { messages = []; main = this }) in
  send pid (A 1);
  send pid (A 2);
  send pid (A 3);
  send pid End;

  match receive_any ~after:500_000L () with
  | Collected_messages [ A 1; A 2; A 3 ] ->
      Logger.debug (fun f -> f "send_order_test: received messages in order");
      Logger.info (fun f -> f "send_order_test: OK");

      shutdown ()
  | _ ->
      Logger.info (fun f -> f "send_order_test: received messages out of order");

      Stdlib.exit 1

let () =
  Logger.set_log_level (Some Info);
  Riot.run @@ main