Skip to content

Commit d284a04

Browse files
committed
0.1.4 Special handling of nils in slice/rslice in CLJS, matching CLJ behaviour (closes #6)
1 parent c7d6db8 commit d284a04

File tree

5 files changed

+142
-145
lines changed

5 files changed

+142
-145
lines changed

CHANGES.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# 0.1.4
2+
3+
Special handling of nils in slice/rslice in CLJS, matching CLJ behaviour #6
4+
15
# 0.1.3
26

37
Fixed NPE in `me.tonsky.persistent-sorted-set.arrays/array?` #4 #5 thx @timothypratley

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ lein jar
2828
Dependency:
2929

3030
```clj
31-
[persistent-sorted-set "0.1.3"]
31+
[persistent-sorted-set "0.1.4"]
3232
```
3333

3434
Code:

project.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
(defproject persistent-sorted-set "0.1.3"
1+
(defproject persistent-sorted-set "0.1.4"
22
:description "Fast B-tree based persistent sorted set for Clojure/Script"
33
:license {:name "MIT"}
44
:url "https://github.com/tonsky/persistent-sorted-set"

src-clojure/me/tonsky/persistent_sorted_set.cljs

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -727,38 +727,42 @@
727727
"Returns path to first element >= key,
728728
or -1 if all elements in a set < key"
729729
[set key comparator]
730-
(loop [node (.-root set)
731-
path empty-path
732-
level (.-shift set)]
733-
(let [keys-l (node-len node)]
734-
(if (== 0 level)
735-
(let [keys (.-keys node)
736-
idx (binary-search-l comparator keys (dec keys-l) key)]
737-
(if (== keys-l idx) -1 (path-set path 0 idx)))
738-
(let [keys (.-keys node)
739-
idx (binary-search-l comparator keys (- keys-l 2) key)]
740-
(recur (arrays/aget (.-pointers node) idx)
741-
(path-set path level idx)
742-
(- level level-shift)))))))
730+
(if (nil? key)
731+
empty-path
732+
(loop [node (.-root set)
733+
path empty-path
734+
level (.-shift set)]
735+
(let [keys-l (node-len node)]
736+
(if (== 0 level)
737+
(let [keys (.-keys node)
738+
idx (binary-search-l comparator keys (dec keys-l) key)]
739+
(if (== keys-l idx) -1 (path-set path 0 idx)))
740+
(let [keys (.-keys node)
741+
idx (binary-search-l comparator keys (- keys-l 2) key)]
742+
(recur (arrays/aget (.-pointers node) idx)
743+
(path-set path level idx)
744+
(- level level-shift))))))))
743745

744746
(defn- -rseek
745747
"Returns path to the first element that is > key.
746748
If all elements in a set are <= key, returns `(-rpath set) + 1`.
747749
It’s a virtual path that is bigger than any path in a tree"
748750
[set key comparator]
749-
(loop [node (.-root set)
750-
path empty-path
751-
level (.-shift set)]
752-
(let [keys-l (node-len node)]
753-
(if (== 0 level)
754-
(let [keys (.-keys node)
755-
idx (binary-search-r comparator keys (dec keys-l) key)]
756-
(path-set path 0 idx))
757-
(let [keys (.-keys node)
758-
idx (binary-search-r comparator keys (- keys-l 2) key)]
759-
(recur (arrays/aget (.-pointers node) idx)
760-
(path-set path level idx)
761-
(- level level-shift)))))))
751+
(if (nil? key)
752+
(inc (-rpath (.-root set) (.-shift set)))
753+
(loop [node (.-root set)
754+
path empty-path
755+
level (.-shift set)]
756+
(let [keys-l (node-len node)]
757+
(if (== 0 level)
758+
(let [keys (.-keys node)
759+
idx (binary-search-r comparator keys (dec keys-l) key)]
760+
(path-set path 0 idx))
761+
(let [keys (.-keys node)
762+
idx (binary-search-r comparator keys (- keys-l 2) key)]
763+
(recur (arrays/aget (.-pointers node) idx)
764+
(path-set path level idx)
765+
(- level level-shift))))))))
762766

763767
(defn- -slice [set key-from key-to comparator]
764768
(let [path (-seek set key-from comparator)]

test-clojure/me/tonsky/persistent_sorted_set/test.cljc

Lines changed: 106 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -57,27 +57,25 @@
5757
(testing "straight 3 layers"
5858
(let [s (into (set/sorted-set) (shuffle (irange 0 5000)))]
5959
(are [from to expected] (= expected (set/slice s from to))
60-
#?@(:clj [
61-
nil nil (irange 0 5000)
62-
63-
-1 nil (irange 0 5000)
64-
0 nil (irange 0 5000)
65-
0.5 nil (irange 1 5000)
66-
1 nil (irange 1 5000)
67-
4999 nil [4999 5000]
68-
4999.5 nil [5000]
69-
5000 nil [5000]
70-
5000.5 nil nil
71-
72-
nil -1 nil
73-
nil 0 [0]
74-
nil 0.5 [0]
75-
nil 1 [0 1]
76-
nil 4999 (irange 0 4999)
77-
nil 4999.5 (irange 0 4999)
78-
nil 5000 (irange 0 5000)
79-
nil 5001 (irange 0 5000)
80-
])
60+
nil nil (irange 0 5000)
61+
62+
-1 nil (irange 0 5000)
63+
0 nil (irange 0 5000)
64+
0.5 nil (irange 1 5000)
65+
1 nil (irange 1 5000)
66+
4999 nil [4999 5000]
67+
4999.5 nil [5000]
68+
5000 nil [5000]
69+
5000.5 nil nil
70+
71+
nil -1 nil
72+
nil 0 [0]
73+
nil 0.5 [0]
74+
nil 1 [0 1]
75+
nil 4999 (irange 0 4999)
76+
nil 4999.5 (irange 0 4999)
77+
nil 5000 (irange 0 5000)
78+
nil 5001 (irange 0 5000)
8179

8280
-2 -1 nil
8381
-1 5001 (irange 0 5000)
@@ -91,27 +89,25 @@
9189
(testing "straight 1 layer, leaf == root"
9290
(let [s (into (set/sorted-set) (shuffle (irange 0 10)))]
9391
(are [from to expected] (= expected (set/slice s from to))
94-
#?@(:clj [
95-
nil nil (irange 0 10)
96-
97-
-1 nil (irange 0 10)
98-
0 nil (irange 0 10)
99-
0.5 nil (irange 1 10)
100-
1 nil (irange 1 10)
101-
9 nil [9 10]
102-
9.5 nil [10]
103-
10 nil [10]
104-
10.5 nil nil
105-
106-
nil -1 nil
107-
nil 0 [0]
108-
nil 0.5 [0]
109-
nil 1 [0 1]
110-
nil 9 (irange 0 9)
111-
nil 9.5 (irange 0 9)
112-
nil 10 (irange 0 10)
113-
nil 11 (irange 0 10)
114-
])
92+
nil nil (irange 0 10)
93+
94+
-1 nil (irange 0 10)
95+
0 nil (irange 0 10)
96+
0.5 nil (irange 1 10)
97+
1 nil (irange 1 10)
98+
9 nil [9 10]
99+
9.5 nil [10]
100+
10 nil [10]
101+
10.5 nil nil
102+
103+
nil -1 nil
104+
nil 0 [0]
105+
nil 0.5 [0]
106+
nil 1 [0 1]
107+
nil 9 (irange 0 9)
108+
nil 9.5 (irange 0 9)
109+
nil 10 (irange 0 10)
110+
nil 11 (irange 0 10)
115111

116112
-2 -1 nil
117113
-1 10 (irange 0 10)
@@ -125,27 +121,25 @@
125121
(testing "reverse 3 layers"
126122
(let [s (into (set/sorted-set) (shuffle (irange 0 5000)))]
127123
(are [from to expected] (= expected (set/rslice s from to))
128-
#?@(:clj [
129-
nil nil (irange 5000 0)
130-
131-
5001 nil (irange 5000 0)
132-
5000 nil (irange 5000 0)
133-
4999.5 nil (irange 4999 0)
134-
4999 nil (irange 4999 0)
135-
1 nil [1 0]
136-
0.5 nil [0]
137-
0 nil [0]
138-
-1 nil nil
139-
140-
nil 5001 nil
141-
nil 5000 [5000]
142-
nil 4999.5 [5000]
143-
nil 4999 [5000 4999]
144-
nil 1 (irange 5000 1)
145-
nil 0.5 (irange 5000 1)
146-
nil 0 (irange 5000 0)
147-
nil -1 (irange 5000 0)
148-
])
124+
nil nil (irange 5000 0)
125+
126+
5001 nil (irange 5000 0)
127+
5000 nil (irange 5000 0)
128+
4999.5 nil (irange 4999 0)
129+
4999 nil (irange 4999 0)
130+
1 nil [1 0]
131+
0.5 nil [0]
132+
0 nil [0]
133+
-1 nil nil
134+
135+
nil 5001 nil
136+
nil 5000 [5000]
137+
nil 4999.5 [5000]
138+
nil 4999 [5000 4999]
139+
nil 1 (irange 5000 1)
140+
nil 0.5 (irange 5000 1)
141+
nil 0 (irange 5000 0)
142+
nil -1 (irange 5000 0)
149143

150144
5002 5001 nil
151145
5001 -1 (irange 5000 0)
@@ -159,27 +153,25 @@
159153
(testing "reverse 1 layer, leaf == root"
160154
(let [s (into (set/sorted-set) (shuffle (irange 0 10)))]
161155
(are [from to expected] (= expected (set/rslice s from to))
162-
#?@(:clj [
163-
nil nil (irange 10 0)
164-
165-
11 nil (irange 10 0)
166-
10 nil (irange 10 0)
167-
9.5 nil (irange 9 0)
168-
9 nil (irange 9 0)
169-
1 nil [1 0]
170-
0.5 nil [0]
171-
0 nil [0]
172-
-1 nil nil
173-
174-
nil 11 nil
175-
nil 10 [10]
176-
nil 9.5 [10]
177-
nil 9 [10 9]
178-
nil 1 (irange 10 1)
179-
nil 0.5 (irange 10 1)
180-
nil 0 (irange 10 0)
181-
nil -1 (irange 10 0)
182-
])
156+
nil nil (irange 10 0)
157+
158+
11 nil (irange 10 0)
159+
10 nil (irange 10 0)
160+
9.5 nil (irange 9 0)
161+
9 nil (irange 9 0)
162+
1 nil [1 0]
163+
0.5 nil [0]
164+
0 nil [0]
165+
-1 nil nil
166+
167+
nil 11 nil
168+
nil 10 [10]
169+
nil 9.5 [10]
170+
nil 9 [10 9]
171+
nil 1 (irange 10 1)
172+
nil 0.5 (irange 10 1)
173+
nil 0 (irange 10 0)
174+
nil -1 (irange 10 0)
183175

184176
12 11 nil
185177
11 -1 (irange 10 0)
@@ -193,23 +185,21 @@
193185
(testing "seq-rseq equivalence"
194186
(let [s (into (set/sorted-set) (shuffle (irange 0 5000)))]
195187
(are [from to] (= (set/slice s from to) (some-> (set/slice s from to) (rseq) (reverse)))
196-
#?@(:clj [
197-
-1 nil
198-
0 nil
199-
2500 nil
200-
5000 nil
201-
5001 nil
202-
203-
nil -1
204-
nil 0
205-
nil 1
206-
nil 2500
207-
nil 5000
208-
nil 5001
209-
210-
nil nil
211-
])
212-
188+
-1 nil
189+
0 nil
190+
2500 nil
191+
5000 nil
192+
5001 nil
193+
194+
nil -1
195+
nil 0
196+
nil 1
197+
nil 2500
198+
nil 5000
199+
nil 5001
200+
201+
nil nil
202+
213203
-1 5001
214204
0 5000
215205
1 4999
@@ -219,22 +209,21 @@
219209
(testing "rseq-seq equivalence"
220210
(let [s (into (set/sorted-set) (shuffle (irange 0 5000)))]
221211
(are [from to] (= (set/rslice s from to) (some-> (set/rslice s from to) (rseq) (reverse)))
222-
#?@(:clj [
223-
-1 nil
224-
0 nil
225-
2500 nil
226-
5000 nil
227-
5001 nil
228-
229-
nil -1
230-
nil 0
231-
nil 1
232-
nil 2500
233-
nil 5000
234-
nil 5001
235-
236-
nil nil
237-
])
212+
-1 nil
213+
0 nil
214+
2500 nil
215+
5000 nil
216+
5001 nil
217+
218+
nil -1
219+
nil 0
220+
nil 1
221+
nil 2500
222+
nil 5000
223+
nil 5001
224+
225+
nil nil
226+
238227
5001 -1
239228
5000 0
240229
4999 1

0 commit comments

Comments
 (0)