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
open Kcas
type 'a t = 'a Elems.t Loc.t
let create () = Loc.make Elems.empty
let copy s = Loc.make @@ Loc.get s
let of_seq xs = Loc.make (Elems.of_seq_rev xs)
module Tx = struct
let length s = Tx.get_as Elems.length s
let is_empty s = Tx.get_as (( == ) Elems.empty) s
let push x s = Tx.modify s @@ Elems.cons x
let pop_opt s = Tx.update_as Elems.hd_opt s Elems.tl_safe
let top_opt s = Tx.get_as Elems.hd_opt s
let clear s = Tx.set s Elems.empty
let swap s1 s2 = Tx.swap s1 s2
let to_seq s = Tx.get_as Elems.to_seq s
end
module Xt = struct
let length ~xt s = Xt.get ~xt s |> Elems.length
let is_empty ~xt s = Xt.get ~xt s == Elems.empty
let push ~xt x s = Xt.modify ~xt s @@ Elems.cons x
let pop_opt ~xt s = Xt.update ~xt s Elems.tl_safe |> Elems.hd_opt
let top_opt ~xt s = Xt.get ~xt s |> Elems.hd_opt
let clear ~xt s = Xt.set ~xt s Elems.empty
let swap ~xt s1 s2 = Xt.swap ~xt s1 s2
let to_seq ~xt s = Elems.to_seq @@ Xt.get ~xt s
end
let length s = Loc.get s |> Elems.length
let is_empty s = Loc.get s == Elems.empty
let push x s = Loc.modify s @@ Elems.cons x
let pop_opt s = Loc.update s Elems.tl_safe |> Elems.hd_opt
let top_opt s = Loc.get s |> Elems.hd_opt
let clear s = Loc.set s Elems.empty
let swap s1 s2 = Kcas.Xt.commit { tx = Kcas.Xt.swap s1 s2 }
let to_seq s = Elems.to_seq @@ Loc.get s
let iter f s = Elems.iter f @@ Loc.get s
let fold f a s = Elems.fold f a @@ Loc.get s
exception Empty
let of_option = function None -> raise Empty | Some value -> value [@@inline]
let top s = top_opt s |> of_option
let pop s = pop_opt s |> of_option