package ecaml

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file timer.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
open! Core
open! Import

include Value.Make_subtype (struct
  let name = "timer"
  let here = [%here]
  let is_in_subtype = Value.is_timer
end)

let timer_list = Var.Wrap.("timer-list" <: list t)
let timer_list_as_value = Var.Wrap.("timer-list" <: value)
let all_scheduled () = Current_buffer.value_exn timer_list
let memq = Funcall.Wrap.("memq" <: t @-> value @-> return bool)
let is_scheduled t = memq t (Current_buffer.value_exn timer_list_as_value)
let to_seconds span = span |> Time_ns.Span.to_sec

let run_at_time =
  Funcall.Wrap.("run-at-time" <: float @-> nil_or float @-> Symbol.t @-> return t)
;;

let run_with_idle_timer =
  Funcall.Wrap.("run-with-idle-timer" <: float @-> nil_or float @-> Symbol.t @-> return t)
;;

let run_with_timer ~idle ?repeat here span ~f ~name ~docstring =
  Defun.defun_nullary_nil name here ~docstring f;
  let make_timer = if idle then run_with_idle_timer else run_at_time in
  make_timer (span |> to_seconds) (repeat |> Option.map ~f:to_seconds) name
;;

let run_after = run_with_timer ~idle:false

let run_after_i ?repeat here span ~f ~name ~docstring =
  ignore (run_after here ?repeat span ~f ~name ~docstring : t)
;;

let run_after_idle = run_with_timer ~idle:true

let run_after_idle_i ?repeat here span ~f ~name ~docstring =
  ignore (run_after_idle here ?repeat span ~f ~name ~docstring : t)
;;

let cancel = Funcall.Wrap.("cancel-timer" <: t @-> return nil)

let sit_for =
  let sit_for = Funcall.Wrap.("sit-for" <: float @-> bool @-> return nil) in
  fun ?(redisplay = true) span ->
    Value.Private.run_outside_async [%here] (fun () ->
      sit_for (span |> to_seconds) (not redisplay))
;;

let sleep_for =
  let sleep_for = Funcall.Wrap.("sleep-for" <: float @-> return nil) in
  fun span ->
    Value.Private.run_outside_async [%here] (fun () -> sleep_for (span |> to_seconds))
;;