talircd/lib/data/wheel.ml

30 lines
549 B
OCaml

type 'a t = {
entries : 'a Dllist.t array;
mutable index : int;
}
let make n = {
entries = Array.init n (fun _ -> Dllist.create ());
index = 0;
}
let queue t =
t.entries.(t.index)
let add t v =
Dllist.add_r v (queue t) |> ignore
let[@tail_mod_cons] rec empty t =
match Dllist.take_l (queue t) with
| x -> x :: empty t
| exception Not_found -> []
let tick t =
t.index <- (t.index + 1) mod Array.length t.entries;
empty t
let iter f t =
for i = 0 to Array.length t.entries - 1 do
Dllist.iter_l f t.entries.(i)
done