forked from rescript-lang/rescript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbelt_Set.cppo.mli
153 lines (114 loc) · 4.55 KB
/
belt_Set.cppo.mli
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
(* Copyright (C) 2017 Authors of ReScript
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* In addition to the permissions granted to you by the LGPL, you may combine
* or link a "work that uses the Library" with a publicly distributed version
* of this file to produce a combined library or application, then distribute
* that combined work under the terms of your choosing, with no requirement
* to comply with the obligations normally placed on you by section 4 of the
* LGPL version 3 (or the corresponding section of a later version of the LGPL
* should you choose to use a later version).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *)
(**
This module is [`Belt.Set`]() specialized with value type to be a primitive type.
It is more efficient in general, the API is the same with [`Belt_Set`]() except its value type is fixed,
and identity is not needed(using the built-in one)
**See** [`Belt.Set`]()
*)
#ifdef TYPE_STRING
type value = string
#elif defined TYPE_INT
type value = int
#else
[%error "unknown type"]
#endif
(** The type of the set elements. *)
type t
(** The type of sets. *)
val empty: t
val fromArray: value array -> t
val fromSortedArrayUnsafe: value array -> t
val isEmpty: t -> bool
val has: t -> value -> bool
val add: t -> value -> t
(** `add s x` If `x` was already in `s`, `s` is returned unchanged. *)
val mergeMany: t -> value array -> t
val remove: t -> value -> t
(** `remove m x` If `x` was not in `m`, `m` is returned reference unchanged. *)
val removeMany: t -> value array -> t
val union: t -> t -> t
val intersect: t -> t -> t
val diff: t -> t -> t
val subset: t -> t -> bool
(** `subset s1 s2` tests whether the set `s1` is a subset of
the set `s2`. *)
val cmp: t -> t -> int
(** Total ordering between sets. Can be used as the ordering function
for doing sets of sets. *)
val eq: t -> t -> bool
(** `eq s1 s2` tests whether the sets `s1` and `s2` are
equal, that is, contain equal elements. *)
val forEachU: t -> (value -> unit [@bs]) -> unit
val forEach: t -> (value -> unit) -> unit
(** `forEach s f` applies `f` in turn to all elements of `s`.
In increasing order *)
val reduceU: t -> 'a -> ('a -> value -> 'a [@bs]) -> 'a
val reduce: t -> 'a -> ('a -> value -> 'a) -> 'a
(** Iterate in increasing order. *)
val everyU: t -> (value -> bool [@bs]) -> bool
val every: t -> (value -> bool) -> bool
(** `every p s` checks if all elements of the set
satisfy the predicate `p`. Order unspecified. *)
val someU: t -> (value -> bool [@bs]) -> bool
val some: t -> (value -> bool) -> bool
(** `some p s` checks if at least one element of
the set satisfies the predicate `p`. Oder unspecified. *)
val keepU: t -> (value -> bool [@bs]) -> t
val keep: t -> (value -> bool) -> t
(** `keep p s` returns the set of all elements in `s`
that satisfy predicate `p`. *)
val partitionU: t -> (value -> bool [@bs]) -> t * t
val partition: t -> (value -> bool) -> t * t
(**
`partition p s` returns a pair of sets `(s1, s2)`, where
`s1` is the set of all the elements of `s` that satisfy the
predicate `p`, and `s2` is the set of all the elements of
`s` that do not satisfy `p`.
*)
val size: t -> int
val toList: t -> value list
(** In increasing order *)
val toArray: t -> value array
val minimum: t -> value option
val minUndefined: t -> value Js.undefined
val maximum: t -> value option
val maxUndefined: t -> value Js.undefined
val get: t -> value -> value option
val getUndefined: t -> value -> value Js.undefined
val getExn: t -> value -> value
val split: t -> value -> (t * t) * bool
(**
`split x s` returns a triple `(l, present, r)`, where
`l` is the set of elements of `s` that are
strictly less than `x`;
`r` is the set of elements of `s` that are
strictly greater than `x`;
`present` is `false` if `s` contains no element equal to `x`,
or `true` if `s` contains an element equal to `x`.
*)
val checkInvariantInternal: t -> unit
(**
**raise** when invariant is not held
*)