package core-and-more

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

Source file HashSetWrapper.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
open Util
open Core

module type ImperativeSet =
sig
  type elt
  type t

  val create : int -> t
  val empty : unit -> t
  val singleton : elt -> t
  val add : elt -> t -> unit
  val remove : elt -> t -> unit
  val size : t -> int
  val is_empty : t -> bool
  val contains : elt -> t -> bool
  val fold : (elt -> 'b -> 'b) -> t -> 'b -> 'b
  val fold2 : (elt -> elt -> 'a -> 'a) -> t -> t -> 'a -> 'a
  val as_list : t -> elt list
  val iter : (elt -> unit) -> t -> unit
  val union : t -> t -> t
  val pp : (Format.formatter -> elt -> unit) -> Format.formatter -> t -> unit
  val update : (elt option -> unit) -> elt -> t -> unit
  val copy : t -> t
end

module HSWrapper(D : Data) =
struct
  module D = struct
    type t = D.t
    [@@deriving ord, show, hash]

    let sexp_of_t _ = failwith "cant call"
  end

  type elt = D.t
  type t = elt Hash_set.t

  let create size =
    Hash_set.create ~size (module D)

  let empty _ =
    Hash_set.create (module D)

  let singleton v =
    Hash_set.of_list (module D) [v]

  let singleton_sized size v =
    Hash_set.of_list ~size (module D) [v]

  let add
      (elt:D.t)
      (s:t)
    : unit =
    Hash_set.add s elt

  let remove
      (elt:D.t)
      (s:t)
    : unit =
    Hash_set.remove s elt

  let size
      (s:t)
    : int =
    Hash_set.length s

  let is_empty
      (s:t)
    : bool =
    Hash_set.is_empty s

  let contains
      (elt:D.t)
      (s:t)
    : bool =
    Hash_set.mem s elt

  let fold
      (type b)
      (f:elt -> b -> b)
      (s:t)
      (init:b)
    : b =
    Hash_set.fold
      ~f:(fun acc e -> f e acc)
      ~init
      s

  let fold2 f a b x =
    let fold2' ea x = fold (f ea) b x in
    fold (fold2') a x

  let exists f s =
    Hash_set.exists
      ~f
      s

  let as_list s =
    Hash_set.to_list
      s

  let iter f s =
    Hash_set.iter ~f s

  let union s1 s2 =
    Hash_set.union s1 s2

  let pp k_pp f s =
    Format.fprintf
      f
      "[";
    iter
      (fun k -> k_pp f k)
      s;
    Format.fprintf
      f
      "]"

  let update
      (f:elt option -> unit)
      (e:elt)
      (s:t)
    : unit =
    if contains e s then
      (f (Some e))
    else
      (f None; add e s)

  let copy
      (x:t)
    : t =
    Hash_set.copy x
end