-
-
Notifications
You must be signed in to change notification settings - Fork 35
Expand file tree
/
Copy pathcore.clj
More file actions
78 lines (66 loc) · 2.02 KB
/
core.clj
File metadata and controls
78 lines (66 loc) · 2.02 KB
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
(ns data-structures.dynamic-array.core
(:refer-clojure :exclude [get set empty? remove]))
;; See tests for the documentation on implementation
(defn ->DynamicArray
[initial-capacity]
(when (>= 0 initial-capacity)
(throw (IllegalArgumentException. "Invalid initial capacity")))
[initial-capacity []])
(defn capacity
[dynamic-array]
(let [[cap _] dynamic-array]
cap))
(defn length
[dynamic-array]
(let [[_ store] dynamic-array]
(count store)))
(defn empty?
[dynamic-array]
(zero? (length dynamic-array)))
(defn get
[dynamic-array idx]
(assert (< -1 idx (length dynamic-array)) "Invalid index value supplied")
(let [[_ store] dynamic-array]
(nth store idx)))
(defn set
[dynamic-array idx value]
(assert (<= 0 idx) "Invalid index value supplied")
(let [[capacity store] dynamic-array]
(if (< idx (dec capacity))
[capacity (assoc store idx value)]
[(* 2 (inc idx)) (into []
cat
[store
(vec (repeat (- idx (count store)) nil))
[value]])])))
(defn remove
[dynamic-array idx]
(assert (< -1 idx (length dynamic-array)) "Invalid index value supplied")
(let [[capacity store] dynamic-array]
[capacity (into []
cat
[(subvec store 0 idx)
(subvec store (inc idx))])]))
(defn next-idx
[dynamic-array]
(length dynamic-array))
(defn append
[dynamic-array value]
(let [[capacity store] dynamic-array]
(if (not= capacity (count store))
[capacity (conj store value)]
[(* 2 capacity) (conj store value)])))
(defn pop-array
[dynamic-array]
(assert (not (empty? dynamic-array)) "Nothing to pop")
(let [[capacity store] dynamic-array]
[capacity (pop store)]))
(defn to-string
[dynamic-array]
(let [^StringBuilder sb (StringBuilder.)]
(.append sb "[ ")
(doseq [i (range (length dynamic-array))]
(.append sb (get dynamic-array i))
(.append sb " "))
(.append sb "]")
(.toString sb)))