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
module type S = sig
type set
type diff = {
added : set;
removed : set;
}
val diff : old:set -> set -> diff
val add_diff : diff -> set -> set
val sub_diff : diff -> set -> set
end
module Make (Set : Set.S) : S with type set := Set.t = struct
type set = Set.t
type diff = {
added : set;
removed : set;
}
let get_added (s1 : set) (s2 : set) : set = Set.diff s2 s1
let get_removed (s1 : set) (s2 : set) : set = Set.diff s1 s2
let diff ~(old : set) (s : set) : diff =
{
added = get_added old s;
removed = get_removed old s;
}
let add_diff (diff : diff) (s : set) : set =
s
|> (fun s -> Set.diff s diff.removed)
|> Set.union diff.added
let sub_diff (diff : diff) (s : set) : set =
s
|> (fun s -> Set.diff s diff.added)
|> Set.union diff.removed
end