Skip to content

Commit 75f5512

Browse files
committed
Added List module. switched tests to ExUnit
1 parent 21ce49e commit 75f5512

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+642
-1316
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
sudo: false
22
language: elixir
33
elixir:
4-
- 1.1.0
4+
- 1.2.0
55
otp_release:
66
- 18.0
77
before_script:

bench/elixir_script_bench.exs

Lines changed: 0 additions & 34 deletions
This file was deleted.

lib/elixir_script/prelude/list.ex

Lines changed: 250 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
1+
defmodule ElixirScript.List do
2+
3+
def duplicate(data, size) do
4+
do_duplicate(data, size, [])
5+
end
6+
7+
defp do_duplicate(_, 0, list) do
8+
list
9+
end
10+
11+
defp do_duplicate(data, size, list) do
12+
do_duplicate(data, size - 1, list ++ [data])
13+
end
14+
15+
def to_tuple(list) do
16+
JS.new(Elixir.Core.Tuple, list)
17+
end
18+
19+
def wrap(list) when is_list(list), do: list
20+
def wrap(nil), do: []
21+
def wrap(term), do: [term]
22+
23+
def append(list, term) do
24+
concat(list, [term])
25+
end
26+
27+
def prepend(list, term) do
28+
concat([term], list)
29+
end
30+
31+
def concat(list_a, list_b) do
32+
list_a.concat(list_b)
33+
end
34+
35+
def first(list) do
36+
list[0]
37+
end
38+
39+
def last(list) do
40+
list[length(list) - 1]
41+
end
42+
43+
def delete(list, item) do
44+
do_delete(list, item, 0, [])
45+
end
46+
47+
defp do_delete(list, item, current_index, new_list) do
48+
if current_index == length(list) do
49+
new_list
50+
else
51+
new_list = case list[current_index] do
52+
^item ->
53+
new_list
54+
_ ->
55+
new_list ++ [list[current_index]]
56+
end
57+
58+
do_delete(list, item, current_index + 1, new_list)
59+
end
60+
end
61+
62+
def delete_at(list, index) do
63+
do_delete_at(list, index, 0, [])
64+
end
65+
66+
defp do_delete_at(list, index, current_index, new_list) do
67+
if current_index == length(list) do
68+
new_list
69+
else
70+
new_list = case current_index == index do
71+
true ->
72+
new_list
73+
_ ->
74+
new_list ++ [list[current_index]]
75+
end
76+
77+
do_delete_at(list, index, current_index + 1, new_list)
78+
end
79+
end
80+
81+
def insert_at(list, index, value) do
82+
do_insert_at(list, index, value, 0, [])
83+
end
84+
85+
defp do_insert_at(list, index, value, current_index, new_list) do
86+
if current_index == length(list) do
87+
new_list
88+
else
89+
new_list = case current_index == index do
90+
true ->
91+
new_list ++ [value, list[current_index]]
92+
_ ->
93+
new_list ++ [list[current_index]]
94+
end
95+
96+
do_insert_at(list, index, value, current_index + 1, new_list)
97+
end
98+
end
99+
100+
def replace_at(list, index, value) do
101+
do_replace_at(list, index, value, 0, [])
102+
end
103+
104+
defp do_replace_at(list, index, value, current_index, new_list) do
105+
if current_index == length(list) do
106+
new_list
107+
else
108+
new_list = case current_index == index do
109+
true ->
110+
new_list ++ [value]
111+
_ ->
112+
new_list ++ [list[current_index]]
113+
end
114+
115+
do_replace_at(list, index, value, current_index + 1, new_list)
116+
end
117+
end
118+
119+
120+
def update_at(list, index, func) do
121+
do_update_at(list, index, func, 0, [])
122+
end
123+
124+
defp do_update_at(list, index, func, current_index, new_list) do
125+
if current_index == length(list) do
126+
new_list
127+
else
128+
new_list = case current_index == index do
129+
true ->
130+
new_list ++ [func.(list[current_index])]
131+
_ ->
132+
new_list ++ [list[current_index]]
133+
end
134+
135+
do_update_at(list, index, func, current_index + 1, new_list)
136+
end
137+
end
138+
139+
140+
def foldl(list, acc, func) do
141+
do_foldl(list, acc, func, [])
142+
end
143+
144+
def foldr(list, acc, func) do
145+
do_foldl(list.concat([]).reverse(), acc, func, [])
146+
end
147+
148+
defp do_foldl([], acc, _, new_list) do
149+
{ acc, new_list }
150+
end
151+
152+
defp do_foldl(list, acc, func, new_list) do
153+
{ acc, value } = func.(hd(list), acc)
154+
do_foldl(tl(list), acc, func, new_list ++ [value])
155+
end
156+
157+
def flatten(list) do
158+
do_flatten(list, [])
159+
end
160+
161+
def flatten(list, tail) do
162+
do_flatten(list, []) ++ tail
163+
end
164+
165+
defp do_flatten([], flattened_list) do
166+
flattened_list
167+
end
168+
169+
defp do_flatten(list, flattened_list) do
170+
flattened_list = case hd(list) do
171+
l when is_list(l) ->
172+
flattened_list ++ do_flatten(l, [])
173+
item ->
174+
flattened_list ++ [item]
175+
end
176+
177+
do_flatten(tl(list), flattened_list)
178+
end
179+
180+
181+
def keydelete(list, key, position) do
182+
do_keydelete(list, key, position, [])
183+
end
184+
185+
defp do_keydelete([], _, _, new_list) do
186+
new_list
187+
end
188+
189+
defp do_keydelete(list, key, position, new_list) do
190+
current_value = hd(list)
191+
192+
new_list = if elem(current_value, position) == key do
193+
new_list
194+
else
195+
new_list ++ [current_value]
196+
end
197+
198+
do_keydelete(tl(list), key, position, new_list)
199+
end
200+
201+
def keyfind(list, key, position) do
202+
do_keyfind(list, key, position, nil)
203+
end
204+
205+
def keyfind(list, key, position, default) do
206+
do_keyfind(list, key, position, default)
207+
end
208+
209+
defp do_keyfind([], _, _, default) do
210+
default
211+
end
212+
213+
defp do_keyfind(list, key, position, default) do
214+
current_value = hd(list)
215+
216+
if elem(current_value, position) == key do
217+
current_value
218+
else
219+
do_keyfind(tl(list), key, position, default)
220+
end
221+
end
222+
223+
def keymember?(list, key, position) do
224+
keyfind(list, key, position) != nil
225+
end
226+
227+
def keyreplace(list, key, position, new_tuple) do
228+
do_keyreplace(list, key, position, [], new_tuple)
229+
end
230+
231+
defp do_keyreplace([], _, _, new_list, _) do
232+
new_list
233+
end
234+
235+
defp do_keyreplace(list, key, position, new_list, new_tuple) do
236+
current_value = hd(list)
237+
238+
new_list = if elem(current_value, position) == key do
239+
new_list ++ [new_tuple]
240+
else
241+
new_list ++ [current_value]
242+
end
243+
244+
do_keyreplace(tl(list), key, position, new_list, new_tuple)
245+
end
246+
247+
def zip(list_of_lists) do
248+
Elixir.Core.Functions.zip(list_of_lists)
249+
end
250+
end

lib/elixir_script/prelude/map.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ defmodule ElixirScript.Map do
5151
true ->
5252
map[key]
5353
false ->
54-
raise "#{key} not found in map"
54+
raise ""
5555
end
5656
end
5757

@@ -185,7 +185,7 @@ defmodule ElixirScript.Map do
185185
true ->
186186
Map.put(map, key, func.(map[key]))
187187
false ->
188-
raise "#{key} not found in map"
188+
raise ""
189189
end
190190
end
191191

lib/elixir_script/prelude/tuple.ex

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,61 @@
11
defmodule ElixirScript.Tuple do
22

33
def duplicate(data, size) do
4-
Elixir.Core.Functions.make_tuple(size, data)
4+
JS.new(Elixir.Core.Tuple, do_duplicate(data, size, []))
5+
end
6+
7+
defp do_duplicate(_, 0, list) do
8+
list
9+
end
10+
11+
defp do_duplicate(data, size, list) do
12+
do_duplicate(data, size - 1, list ++ [data])
513
end
614

715
def to_list(tuple) do
816
tuple["value"]
917
end
1018

1119
def insert_at(tuple, index, value) do
12-
Elixir.Core.Functions.insert_at(tuple, index, value)
20+
JS.new(Elixir.Core.Tuple, do_insert_at(tuple, index, value, 0, []))
21+
end
22+
23+
defp do_insert_at(tuple, index, value, current_index, list) do
24+
if current_index == length(tuple) do
25+
list
26+
else
27+
list = case index == current_index do
28+
true ->
29+
list ++ [value, tuple.get(current_index)]
30+
false ->
31+
list ++ [tuple.get(current_index)]
32+
end
33+
34+
do_insert_at(tuple, index, value, current_index + 1, list)
35+
end
1336
end
1437

1538
def delete_at(tuple, index) do
16-
Elixir.Core.Functions.delete_at(tuple, index)
39+
JS.new(Elixir.Core.Tuple, delete_at(tuple, index, 0, []))
40+
end
41+
42+
defp delete_at(tuple, index, current_index, list) do
43+
if current_index == length(tuple) do
44+
list
45+
else
46+
list = case index == current_index do
47+
true ->
48+
list
49+
false ->
50+
list ++ [tuple.get(current_index)]
51+
end
52+
53+
delete_at(tuple, index, current_index + 1, list)
54+
end
1755
end
1856

1957
def append(tuple, value) do
20-
Elixir.Core.Functions.new_tuple.apply(nil, to_list(tuple) ++ value)
58+
#JS.new(Elixir.Core.Tuple, to_list(tuple) ++ [value])
2159
end
2260

2361
end

0 commit comments

Comments
 (0)