Tickers in OCaml

Our example demonstrates the use of tickers in OCaml. Tickers are useful when you want to perform an action repeatedly at regular intervals.

open Unix

let ticker interval =
  let rec loop () =
    Unix.sleepf interval;
    let now = Unix.gettimeofday () in
    Printf.printf "Tick at %f\n" now;
    loop ()
  in
  loop

let main () =
  let stop = ref false in
  let ticker_thread = Thread.create (fun () ->
    while not !stop do
      Unix.sleepf 0.5;
      let now = Unix.gettimeofday () in
      Printf.printf "Tick at %f\n" now
    done
  ) () in

  Unix.sleepf 1.6;
  stop := true;
  Thread.join ticker_thread;
  print_endline "Ticker stopped"

let () = main ()

In this OCaml version, we use threads to simulate the behavior of tickers. Here’s a breakdown of the code:

  1. We define a ticker function that takes an interval as an argument. This function uses recursion to repeatedly sleep for the given interval and then print the current time.

  2. In the main function, we create a mutable stop variable to control the ticker thread.

  3. We create a thread using Thread.create that runs our ticker logic. It checks the stop variable in each iteration to determine whether it should continue.

  4. The main thread sleeps for 1.6 seconds using Unix.sleepf 1.6.

  5. After 1.6 seconds, we set stop to true to signal the ticker thread to stop.

  6. We use Thread.join to wait for the ticker thread to finish.

  7. Finally, we print “Ticker stopped” to indicate that the ticker has been stopped.

When we run this program, the ticker should tick approximately 3 times before we stop it.

$ ocamlc unix.cma threads.cma tickers.ml -o tickers
$ ./tickers
Tick at 1623456789.123456
Tick at 1623456789.623456
Tick at 1623456790.123456
Ticker stopped

Note that the exact timing and number of ticks may vary slightly due to system scheduling and the nature of threads.