Skip to content

Commit c13f009

Browse files
committed
feat(dict): adding dictionary lib and tests
1 parent ab3970c commit c13f009

File tree

3 files changed

+394
-0
lines changed

3 files changed

+394
-0
lines changed

Dict.ark

Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
# @brief Get a value from a given dictionary using a key, or nil if it doesn't exist
2+
# @param _D dictionary
3+
# @param _key key to get
4+
# =begin
5+
# (let data (dict "key" "value"))
6+
# (print (dict:get data "key")) # value
7+
# =end
8+
# @author https://github.com/SuperFola
9+
(let get (fun (_D _key) (builtin__dict:get _D _key)))
10+
11+
# @brief Adds or replaces an entry to a dictionary, given a (key, value) pair
12+
# @details The dictionary is modified in place
13+
# @param _D dictionary
14+
# @param _key key to add (or replace)
15+
# @param _value value for the given key
16+
# =begin
17+
# (let data (dict "key" "value"))
18+
# (dict:add data "hello" "world")
19+
# (dict:add data "key" "hole") # key:value will be replaced by key:hole
20+
# (print data) # {key: hole, hello: world}
21+
# =end
22+
# @author https://github.com/SuperFola
23+
(let add (fun (_D _key _value) (builtin__dict:add _D _key _value)))
24+
25+
# @brief
26+
# @param _D dictionary
27+
# =begin
28+
# (let data (dict "key" "value"))
29+
# (print (dict:contains data "key")) # true
30+
# (print (dict:contains data "test")) # false
31+
# =end
32+
# @author https://github.com/SuperFola
33+
(let contains (fun (_D _key) (builtin__dict:contains _D _key)))
34+
35+
# @brief Deletes an entry from a dictionary, given a key
36+
# @details The dictionary is modified in place
37+
# @param _D dictionary
38+
# @param _key key to delete
39+
# =begin
40+
# (let data (dict "key" "value"))
41+
# (dict:remove data "key")
42+
# (print (dict:get data "key")) # nil
43+
# =end
44+
# @author https://github.com/SuperFola
45+
(let remove (fun (_D _key) (builtin__dict:remove _D _key)))
46+
47+
# @brief Returns a list of the keys of a dictionary
48+
# @param _D dictionary
49+
# =begin
50+
# (let data (dict "key" "value" 5 12))
51+
# (print (dict:keys data)) # [key, 5]
52+
# =end
53+
# @author https://github.com/SuperFola
54+
(let keys (fun (_D) (builtin__dict:keys _D)))
55+
56+
# @brief Computes the number of (key, value) pairs in a given dictionary
57+
# @param _D dictionary
58+
# =begin
59+
# (let data (dict "key" "value"))
60+
# (print (dict:size data)) # 1
61+
# =end
62+
# @author https://github.com/SuperFola
63+
(let size (fun (_D) (builtin__dict:size _D)))
64+
65+
# @brief Returns a list of the values of a dictionary
66+
# @param _D dictionary
67+
# =begin
68+
# (let data (dict "key" "value" 5 12))
69+
# (print (dict:values data)) # [value, 12]
70+
# =end
71+
# @author https://github.com/SuperFola
72+
(let values (fun (_D) {
73+
(mut _output [])
74+
(let _keys (keys _D))
75+
(mut _i 0)
76+
(while (< _i (len _keys)) {
77+
(append! _output (get _D (@ _keys _i)))
78+
(set _i (+ 1 _i)) })
79+
_output }))
80+
81+
# @brief Returns a list of the entries of a dictionary
82+
# @param _D dictionary
83+
# =begin
84+
# (let data (dict "key" "value" 5 12))
85+
# (print (dict:entries data)) # [[key, value], [5, 12]]
86+
# =end
87+
# @author https://github.com/SuperFola
88+
(let entries (fun (_D) {
89+
(mut _output [])
90+
(let _keys (keys _D))
91+
(mut _i 0)
92+
(while (< _i (len _keys)) {
93+
(let key (@ _keys _i))
94+
(let val (get _D key))
95+
(append! _output [key val])
96+
(set _i (+ 1 _i)) })
97+
_output }))
98+
99+
# @brief Map each value in a dictionary with a given function
100+
# @details The original dictionary is not modified
101+
# @param _D dictionary
102+
# @param _f function to apply to each value, taking both key and value as arguments
103+
# =begin
104+
# (let data (dict "key" "value"))
105+
# (dict:map data (fun (key value) (format "{}-{}" key value)))
106+
# (print data) # {key: key-value}
107+
# =end
108+
# @author https://github.com/SuperFola
109+
(let map (fun (_D _f) {
110+
(let _new (dict))
111+
(mut _i 0)
112+
(let _keys (keys _D))
113+
(while (< _i (len _keys)) {
114+
(let _key (@ _keys _i))
115+
(add _new _key (_f _key (get _D _key)))
116+
(set _i (+ 1 _i)) })
117+
_new }))
118+
119+
# @brief Map each value in a dictionary with a given function
120+
# @details The original dictionary is updated in place
121+
# @param _D dictionary
122+
# @param _f function to apply to each value, taking both key and value as arguments
123+
# =begin
124+
# (let data (dict "key" "value"))
125+
# (dict:map data (fun (key value) (format "{}-{}" key value)))
126+
# (print data) # {key: key-value}
127+
# =end
128+
# @author https://github.com/SuperFola
129+
(let map! (fun (_D _f) {
130+
(mut _i 0)
131+
(let _keys (keys _D))
132+
(while (< _i (len _keys)) {
133+
(let _key (@ _keys _i))
134+
(add _D _key (_f _key (get _D _key)))
135+
(set _i (+ 1 _i)) })}))
136+
137+
# @brief Iterate over the pairs of a dictionary with a given function
138+
# @param _D dictionary
139+
# @param _f function to call on each pair
140+
# =begin
141+
# (let data (dict "key" "value" 5 12))
142+
# (dict:forEach data (fun (key value) (print (format "{}-{}" key value))))
143+
# # key-value
144+
# # 5-12
145+
# =end
146+
# @author https://github.com/SuperFola
147+
(let forEach (fun (_D _f) {
148+
(mut _i 0)
149+
(let _keys (keys _D))
150+
(while (< _i (len _keys)) {
151+
(let _key (@ _keys _i))
152+
(_f _key (get _D _key))
153+
(set _i (+ 1 _i)) })}))
154+
155+
# @brief Filter a dictionary with a predicate
156+
# @details The original dictionary is not modified
157+
# @param _D dictionary
158+
# @param _f predicate, taking both key and value as arguments
159+
# =begin
160+
# (let data (dict "key" "value" "hello" "world"))
161+
# (let new (dict:filter data (fun (key value) (> (len key) 3))))
162+
# (print data) # {key: value, hello: world}
163+
# (print new) # {hello: world}
164+
# =end
165+
# @author https://github.com/SuperFola
166+
(let filter (fun (_D _f) {
167+
(let _new (dict))
168+
(mut _i 0)
169+
(let _keys (keys _D))
170+
(while (< _i (len _keys)) {
171+
(let _key (@ _keys _i))
172+
(let _val (get _D _key))
173+
(if (_f _key _val)
174+
(add _new _key _val))
175+
(set _i (+ 1 _i)) })
176+
_new }))
177+
178+
# @brief Filter a dictionary with a predicate
179+
# @details The original dictionary is updated in place
180+
# @param _D dictionary
181+
# @param _f predicate, taking both key and value as arguments
182+
# =begin
183+
# (let data (dict "key" "value" "hello" "world"))
184+
# (let new (dict:filter data (fun (key value) (> (len key) 3))))
185+
# (print data) # {key: value, hello: world}
186+
# (print new) # {hello: world}
187+
# =end
188+
# @author https://github.com/SuperFola
189+
(let filter! (fun (_D _f) {
190+
(mut _i 0)
191+
(let _keys (keys _D))
192+
(while (< _i (len _keys)) {
193+
(let _key (@ _keys _i))
194+
(let _val (get _D _key))
195+
(if (not (_f _key _val))
196+
(remove _D _key))
197+
(set _i (+ 1 _i)) }) }))
198+
199+
# @brief Copy a dictionary
200+
# @details The original dictionary is not modified
201+
# @param _D dictionary to copy
202+
# =begin
203+
# (let data (dict "key" "value" "hello" "world"))
204+
# (let new (dict:copy data))
205+
# (dict:add data "test" 12)
206+
# (print data) # {key: value, hello: world, test: 12}
207+
# (print new) # {key: value, hello: world}
208+
# =end
209+
# @author https://github.com/SuperFola
210+
(let copy (fun (_D) {
211+
(let _new (dict))
212+
(let _keys (keys _D))
213+
(mut _i 0)
214+
(while (< _i (len _keys)) {
215+
(let _key (@ _keys _i))
216+
(add _new _key (get _D _key))
217+
(set _i (+ 1 _i)) })
218+
_new }))
219+
220+
# @brief Update a dictionary with (key, value) pairs from a second dictionary
221+
# @details The original dictionary is updated in place
222+
# @param _D dictionary to update
223+
# @param _D2 second dictionary
224+
# =begin
225+
# (let data (dict "key" "value" "hello" "world"))
226+
# (let new (dict "key" "new value" 5 12))
227+
# (dict:update data new)
228+
# (print data) # {key: new value, hello: world, 5: 12}
229+
# =end
230+
# @author https://github.com/SuperFola
231+
(let update! (fun (_D _D2) {
232+
(mut _i 0)
233+
(let _keys (keys _D2))
234+
(while (< _i (len _keys)) {
235+
(let _key (@ _keys _i))
236+
(add _D _key (get _D2 _key))
237+
(set _i (+ 1 _i)) })}))

tests/all.ark

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
(import dict-tests)
12
(import events-tests)
23
(import exceptions-tests)
34
(import functional-tests)
@@ -14,6 +15,7 @@
1415
(import std.List)
1516

1617
(let outputs (list:unzip [
18+
dict-tests:dict-output
1719
events-tests:events-output
1820
exceptions-tests:exceptions-output
1921
functional-tests:functional-output

0 commit comments

Comments
 (0)