Skip to content
This repository was archived by the owner on Oct 23, 2024. It is now read-only.

Commit 8db6b81

Browse files
authored
Add cppo sources for Belt map/set/sort (#6)
1 parent 60a007f commit 8db6b81

20 files changed

+3017
-8
lines changed

belt-cppo/belt_Set.cppo.res

+233
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,233 @@
1+
#ifdef TYPE_INT
2+
module I = Belt_internalSetInt
3+
#elif defined TYPE_STRING
4+
module I = Belt_internalSetString
5+
#else
6+
[%error "unknown type"]
7+
#endif
8+
9+
module N = Belt_internalAVLset
10+
module A = Belt_Array
11+
12+
type value = I.value
13+
type t = I.t
14+
15+
let empty = None
16+
let isEmpty = N.isEmpty
17+
let minimum = N.minimum
18+
let minUndefined = N.minUndefined
19+
let maximum = N.maximum
20+
let maxUndefined = N.maxUndefined
21+
22+
let forEach = N.forEach
23+
let forEachU = N.forEachU
24+
let reduce = N.reduce
25+
let reduceU = N.reduceU
26+
let every = N.every
27+
let everyU = N.everyU
28+
let some = N.some
29+
let someU = N.someU
30+
let keep = N.keepShared
31+
let keepU = N.keepSharedU
32+
let partition = N.partitionShared
33+
let partitionU = N.partitionSharedU
34+
35+
let size = N.size
36+
let toList = N.toList
37+
let toArray = N.toArray
38+
let fromSortedArrayUnsafe = N.fromSortedArrayUnsafe
39+
let checkInvariantInternal = N.checkInvariantInternal
40+
41+
let rec add = (t: t, x: value): t =>
42+
switch t {
43+
| None => N.singleton(x)
44+
| Some(nt) =>
45+
let v = nt.value
46+
if x == v {
47+
t
48+
} else {
49+
let {N.left: l, right: r} = nt
50+
if x < v {
51+
let ll = add(l, x)
52+
if ll === l {
53+
t
54+
} else {
55+
N.bal(ll, v, r)
56+
}
57+
} else {
58+
let rr = add(r, x)
59+
if rr === r {
60+
t
61+
} else {
62+
N.bal(l, v, rr)
63+
}
64+
}
65+
}
66+
}
67+
68+
let mergeMany = (h, arr) => {
69+
let len = A.length(arr)
70+
let v = ref(h)
71+
for i in 0 to len - 1 {
72+
let key = A.getUnsafe(arr, i)
73+
v.contents = add(v.contents, key)
74+
}
75+
v.contents
76+
}
77+
78+
let rec remove = (t: t, x: value): t =>
79+
switch t {
80+
| None => t
81+
| Some(n) =>
82+
let {N.left: l, value: v, right: r} = n
83+
if x == v {
84+
switch (l, r) {
85+
| (None, _) => r
86+
| (_, None) => l
87+
| (_, Some(rn)) =>
88+
let v = ref(rn.value)
89+
let r = N.removeMinAuxWithRef(rn, v)
90+
N.bal(l, v.contents, r)
91+
}
92+
} else if x < v {
93+
let ll = remove(l, x)
94+
if ll === l {
95+
t
96+
} else {
97+
N.bal(ll, v, r)
98+
}
99+
} else {
100+
let rr = remove(r, x)
101+
if rr === r {
102+
t
103+
} else {
104+
N.bal(l, v, rr)
105+
}
106+
}
107+
}
108+
109+
let removeMany = (h, arr) => {
110+
let len = A.length(arr)
111+
let v = ref(h)
112+
for i in 0 to len - 1 {
113+
let key = A.getUnsafe(arr, i)
114+
v.contents = remove(v.contents, key)
115+
}
116+
v.contents
117+
}
118+
119+
let fromArray = I.fromArray
120+
let cmp = I.cmp
121+
let eq = I.eq
122+
let get = I.get
123+
let getUndefined = I.getUndefined
124+
let getExn = I.getExn
125+
let subset = I.subset
126+
let has = I.has
127+
128+
let rec splitAuxNoPivot = (n: N.node<_>, x: value): (t, t) => {
129+
let {N.left: l, value: v, right: r} = n
130+
if x == v {
131+
(l, r)
132+
} else if x < v {
133+
switch l {
134+
| None => (None, Some(n))
135+
| Some(l) =>
136+
let (ll, rl) = splitAuxNoPivot(l, x)
137+
(ll, N.joinShared(rl, v, r))
138+
}
139+
} else {
140+
switch r {
141+
| None => (Some(n), None)
142+
| Some(r) =>
143+
let (lr, rr) = splitAuxNoPivot(r, x)
144+
(N.joinShared(l, v, lr), rr)
145+
}
146+
}
147+
}
148+
149+
let rec splitAuxPivot = (n: N.node<_>, x: value, pres): (t, t) => {
150+
let {N.left: l, value: v, right: r} = n
151+
if x == v {
152+
pres.contents = true
153+
(l, r)
154+
} else if x < v {
155+
switch l {
156+
| None => (None, Some(n))
157+
| Some(l) =>
158+
let (ll, rl) = splitAuxPivot(l, x, pres)
159+
(ll, N.joinShared(rl, v, r))
160+
}
161+
} else {
162+
switch r {
163+
| None => (Some(n), None)
164+
| Some(r) =>
165+
let (lr, rr) = splitAuxPivot(r, x, pres)
166+
(N.joinShared(l, v, lr), rr)
167+
}
168+
}
169+
}
170+
171+
let split = (t: t, x: value) =>
172+
switch t {
173+
| None => ((None, None), false)
174+
| Some(n) =>
175+
let pres = ref(false)
176+
let v = splitAuxPivot(n, x, pres)
177+
(v, pres.contents)
178+
}
179+
180+
let rec union = (s1: t, s2: t) =>
181+
switch (s1, s2) {
182+
| (None, _) => s2
183+
| (_, None) => s1
184+
| (Some(n1), Some(n2)) /* (Node(l1, v1, r1, h1), Node(l2, v2, r2, h2)) */ =>
185+
let (h1, h2) = (n1.height, n2.height)
186+
if h1 >= h2 {
187+
if h2 == 1 {
188+
add(s1, n2.value)
189+
} else {
190+
let {N.left: l1, value: v1, right: r1} = n1
191+
let (l2, r2) = splitAuxNoPivot(n2, v1)
192+
N.joinShared(union(l1, l2), v1, union(r1, r2))
193+
}
194+
} else if h1 == 1 {
195+
add(s2, n1.value)
196+
} else {
197+
let {N.left: l2, value: v2, right: r2} = n2
198+
let (l1, r1) = splitAuxNoPivot(n1, v2)
199+
N.joinShared(union(l1, l2), v2, union(r1, r2))
200+
}
201+
}
202+
203+
let rec intersect = (s1: t, s2: t) =>
204+
switch (s1, s2) {
205+
| (None, _) | (_, None) => None
206+
| (Some(n1), Some(n2)) /* (Node(l1, v1, r1, _), t2) */ =>
207+
let {N.left: l1, value: v1, right: r1} = n1
208+
let pres = ref(false)
209+
let (l2, r2) = splitAuxPivot(n2, v1, pres)
210+
let ll = intersect(l1, l2)
211+
let rr = intersect(r1, r2)
212+
if pres.contents {
213+
N.joinShared(ll, v1, rr)
214+
} else {
215+
N.concatShared(ll, rr)
216+
}
217+
}
218+
219+
let rec diff = (s1: t, s2: t) =>
220+
switch (s1, s2) {
221+
| (None, _) | (_, None) => s1
222+
| (Some(n1), Some(n2)) /* (Node(l1, v1, r1, _), t2) */ =>
223+
let {N.left: l1, value: v1, right: r1} = n1
224+
let pres = ref(false)
225+
let (l2, r2) = splitAuxPivot(n2, v1, pres)
226+
let ll = diff(l1, l2)
227+
let rr = diff(r1, r2)
228+
if pres.contents {
229+
N.concatShared(ll, rr)
230+
} else {
231+
N.joinShared(ll, v1, rr)
232+
}
233+
}

0 commit comments

Comments
 (0)