Skip to content

Commit 04765dd

Browse files
committed
improve collections
1 parent 51dc09a commit 04765dd

File tree

7 files changed

+196
-80
lines changed

7 files changed

+196
-80
lines changed

PLATFORM/C/LIB/collections.lsts

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
2+
let cmp(ls: ta, rs: tb): Ord = (
3+
let diff = Equal;
4+
5+
let lslen = ls.length();
6+
let rslen = rs.length();
7+
8+
let li = 0_u64;
9+
let ri = 0_u64;
10+
11+
while is(diff, Equal) && li < lslen && ri < rslen {
12+
diff = cmp(ls[li], rs[ri]);
13+
li = li + 1;
14+
ri = ri + 1;
15+
};
16+
if not(is(diff,Equal)) then diff else
17+
if li == lslen && ri != rslen then LessThan else
18+
if li != lslen && ri == rslen then GreaterThan else
19+
Equal
20+
);
21+
22+
let .contains(self: t, value: e): U64 = (
23+
let ok = false;
24+
let len = self.length();
25+
let i = 0_u64;
26+
while not(ok) && i < len {
27+
if self[i] == value {
28+
ok = true;
29+
};
30+
i = i + 1;
31+
};
32+
ok
33+
);
34+
35+
let .join(self: t, sep: String, prefix: String, suffix: String): String = (
36+
let out = prefix;
37+
let len = self.length();
38+
let i = 0_u64;
39+
while i < len {
40+
if i != 0 {
41+
out = out + sep;
42+
};
43+
out = out + to-smart-string(self[i]);
44+
i = i + 1;
45+
};
46+
if suffix.length() > 0 {
47+
out = out + suffix;
48+
};
49+
out
50+
);
51+
52+
let .join(self: t, sep: String): String = (
53+
self.join(sep, "", "")
54+
);
55+
56+
# should not be used
57+
let .join(self: t, sep: CString): CString = (
58+
untern(self.join(intern(sep), "", ""))
59+
);
60+
61+
let to-smart-string(ls: t): String = (
62+
ls.join(", ", "[", "]")
63+
);
64+
65+
let .find-first(list: t, elem: e): Maybe<U64> = (
66+
let found = false;
67+
68+
let i = 0_u64;
69+
let len = list.length();
70+
while i < len {
71+
if list[i] == elem {
72+
found = true;
73+
i = len; # break
74+
} else {
75+
i = i + 1;
76+
};
77+
};
78+
79+
if found {
80+
Some{i}
81+
} else {
82+
None{} :: Maybe<U64>
83+
}
84+
);
85+
86+
let .find-last(list: t, elem: e): Maybe<U64> = (
87+
let found = false;
88+
let found_idx = 0_u64;
89+
90+
let i = 0_u64;
91+
let len = list.length();
92+
while i < len {
93+
if list[i] == elem {
94+
found = true;
95+
found_idx = i;
96+
};
97+
i = i + 1;
98+
};
99+
100+
if found {
101+
Some{found_idx}
102+
} else {
103+
None{} :: Maybe<U64>
104+
}
105+
);

PLATFORM/C/LIB/default.lsts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,4 @@ import PLATFORM/C/LIB/regex.lm;
4747
import PLATFORM/C/LIB/cmp.lsts;
4848
import PLATFORM/C/LIB/print.lsts;
4949
import PLATFORM/C/LIB/umbra.lsts;
50+
import PLATFORM/C/LIB/collections.lsts;

PLATFORM/C/LIB/io.lsts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11

22
let .file-extension(path: CString): CString = (
3-
while head-string(path) != 0_u8 && head-string(path) != 46_u8 {
4-
path = tail-string(path);
5-
};
6-
path
3+
let dot = path.find-last(46_u8);
4+
match dot {
5+
Some{content=content} => path.substring(content + 1);
6+
None{} => untern("");
7+
}
78
);

PLATFORM/C/LIB/list.lm

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -121,23 +121,3 @@ print := λ(: l List<x>). (: (
121121
))
122122
r
123123
) U64);
124-
125-
.contains := λ(: l List<x>)(: i x). (: (
126-
(let r 0_u64)
127-
(while (non-zero l) (
128-
(if (==( (head l) i )) (set r 1_u64) ())
129-
(set l (tail l))
130-
))
131-
r
132-
) U64);
133-
134-
.join := λ(: l List<String>)(: sep String). (: (
135-
(let r SNil)
136-
(while (non-zero l) (
137-
(set r (+( r (SAtom(head l)) )))
138-
(set l (tail l))
139-
(if (non-zero l) (set r (+( r (SAtom sep) ))) ())
140-
))
141-
(clone-rope r)
142-
) String);
143-

PLATFORM/C/LIB/list.lsts

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,9 @@
11

2-
let cmp(ls: List<x>, rs: List<x>): Ord = (
3-
let diff = Equal;
4-
while is(diff, Equal) && non-zero(ls) && non-zero(rs) {
5-
diff = cmp(head(ls), head(rs));
6-
ls = tail(ls);
7-
rs = tail(rs);
2+
let $"[]"(tt: List<x>, idx: U64): x = (
3+
while idx > 0 {
4+
tt = tail(tt);
85
};
9-
if not(is(diff,Equal)) then diff else
10-
if not(non-zero(ls)) && non-zero(rs) then LessThan else
11-
if non-zero(ls) && not(non-zero(rs)) then GreaterThan else
12-
Equal
13-
);
14-
15-
let to-smart-string(ls: List<x>): String = (
16-
let s = "[";
17-
let si = 0_u64;
18-
for l in ls {
19-
if si > 0_u64 {
20-
s = s + ",";
21-
};
22-
s = s + to-smart-string(l);
23-
si = si + 1_u64;
24-
};
25-
s = s + "]";
26-
s
6+
head(tt)
277
);
288

299
let .unique(ls: List<x>): List<x> = (

PLATFORM/C/LIB/string.lsts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
11

2+
let .substring(self: CString, begin: U64): CString = (
3+
((((self as U8[]) as U64) + begin) as U8[]) as CString
4+
);
5+
6+
let $"[]"(self: CString, idx: U64): U8 = (
7+
(self as U8[])[idx]
8+
);
9+
210
let cmp(l: CString, r: CString): Ord = (
311
let c = strcmp( (l as U8[]), (r as U8[]) );
412
if c < 0_i32 { LessThan }

PLATFORM/C/LIB/vector.lsts

Lines changed: 73 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,45 @@ let mk-vector(type: Type<t>, capacity: U64): Vector<t> = (
66
Vector { (malloc(data-sz) as t[]), 0_u64, capacity }
77
);
88

9+
# does not change length
10+
let .realloc(v: Vector<t>, target-capacity: U64): Vector<t> = (
11+
let data-sz = sizeof(t) * target-capacity;
12+
let newp = realloc(v.data as ?[], data-sz) as t[];
13+
Vector { newp, v.length, target-capacity }
14+
);
15+
916
let .push(v: Vector<t>, i: t): Vector<t> = (
1017
if v.length >= v.capacity {
11-
fail("Vector Overflow during .push")
18+
let new-cap = if v.capacity == 0 {
19+
4
20+
} else { # mul 1.5
21+
(v.capacity << 1) + v.capacity
22+
};
23+
v = v.realloc(new-cap);
1224
};
1325
v.data[v.length] = i;
1426
v.length = v.length + 1_u64;
1527
v
1628
);
1729

30+
let .pop(v: Vector<t>): Tuple<Vector<t>, t> = (
31+
if v.length() == 0 {
32+
fail("Tried to pop from empty Vector.");
33+
};
34+
let lasti = v.length - 1;
35+
let last = v[lasti];
36+
v.length = lasti;
37+
v.capacity = v.capacity;
38+
39+
let too-much = v.capacity - v.length;
40+
let minimum = (v.length << 1) + v.length; # mul 1.5
41+
if too-much > minimum {
42+
v = v.realloc(minimum);
43+
};
44+
45+
Tuple { v, last }
46+
);
47+
1848
let .to-vector(l: List<t>): Vector<t> = (
1949
let v = mk-vector(type(t), l.length);
2050
for i in l {
@@ -32,10 +62,15 @@ let $"[]"( v: Vector<t>, i: U64 ): t = (
3262

3363
let $"+"( vl: Vector<t>, vr: Vector<t> ): t = (
3464
let v = mk-vector(type(t), vl.length + vr.length);
35-
let vi = 0_u64;
36-
while vi < vl.length { v = v.push(vl[vi]); };
37-
vi = 0_u64;
38-
while vi < vr.length { v = v.push(vr[vi]); };
65+
66+
for x in vl.unsafe-iter() {
67+
v = v.push(x);
68+
};
69+
70+
for x in vr.unsafe-iter() {
71+
v = v.push(x);
72+
};
73+
3974
v
4075
);
4176

@@ -47,6 +82,38 @@ let $"set[]"( v: Vector<t>, i: U64, val: t ): Nil = (
4782
()
4883
);
4984

85+
type VectorIter<t> = VectorIter { vec: Vector<t>, idx: U64 };
86+
87+
# for safety, we clone the vector
88+
# All modifications done to the vector after creating the iterator will not be seen
89+
let .iter(v: Vector<t>): VectorIter<t> = (
90+
let clone = mk-vector(type(t), v.length);
91+
let i = 0_u64;
92+
while i < v.length {
93+
clone = clone.push(v[i]);
94+
i = i + 1;
95+
};
96+
97+
clone.unsafe-iter()
98+
);
99+
100+
# If you modify the vector after creating the iterator, weird things will happen
101+
let .unsafe-iter(v: Vector<t>): VectorIter<t> = (
102+
VectorIter { v, 0_u64 }
103+
);
104+
105+
let .next(p: Array<VectorIter<t>,?>): Maybe<t> = (
106+
let v = p[0];
107+
if v.idx < v.vec.length {
108+
let val = v.vec[v.idx];
109+
v.idx = v.idx + 1;
110+
p[0] = v;
111+
Some { val }
112+
} else {
113+
None
114+
}
115+
);
116+
50117
let .sort(v: Vector<t>): Vector<t> = (
51118
let n = v.length;
52119
let i = 0_u64;
@@ -71,32 +138,6 @@ let .sort(v: Vector<t>): Vector<t> = (
71138
);
72139

73140
let print(v: Vector<x>): Nil = (
74-
let vi = 0_u64;
75-
print(c"[");
76-
while vi < v.length {
77-
if vi > 0_u64 then print(c",");
78-
print(v.data[vi]);
79-
vi = vi + 1_u64;
80-
};
81-
print(c"]");
141+
print(untern(to-smart-string(v)));
82142
);
83143

84-
let $"=="(a: Vector<t>, b: Vector<t>): U64 = (
85-
let al = a.length();
86-
let bl = b.length();
87-
if al == bl {
88-
let i = 0_u64;
89-
let ok = 1_u64;
90-
while i < al {
91-
if a[i] != b[i] {
92-
ok = 0_u64;
93-
i = al; # break
94-
} else {
95-
i = i + 1;
96-
}
97-
};
98-
ok
99-
} else {
100-
0_u64
101-
}
102-
);

0 commit comments

Comments
 (0)