aboutsummaryrefslogtreecommitdiff
path: root/set
diff options
context:
space:
mode:
authorJulian Hurst <julian.hurst92@gmail.com>2022-05-15 01:36:43 +0200
committerJulian Hurst <julian.hurst92@gmail.com>2022-05-15 01:36:43 +0200
commit35639332a5dc8e9b26e8299c999940a9b6ca2ddb (patch)
tree909bdfc2f6354aa25721ac67e9441c430d3b46e6 /set
parent1aece8326ee62e242f308c3dbeb5f2bb5e2d53b9 (diff)
downloadilhare-35639332a5dc8e9b26e8299c999940a9b6ca2ddb.tar.gz
Add marking support (contains, fnmatch, regex)
Diffstat (limited to 'set')
-rw-r--r--set/set.ha80
1 files changed, 80 insertions, 0 deletions
diff --git a/set/set.ha b/set/set.ha
new file mode 100644
index 0000000..2c56efe
--- /dev/null
+++ b/set/set.ha
@@ -0,0 +1,80 @@
+export type set = struct {
+ items: []size,
+};
+
+export type nosuchitem = !void;
+
+export fn add(s: *set, item: size) bool = {
+ for (let i = 0z; i < len(s.items); i += 1) {
+ if (s.items[i] == item) {
+ return false;
+ };
+ };
+ append(s.items, item);
+ return true;
+};
+
+export fn del(s: *set, item: size) bool = {
+ match (contains(*s, item)) {
+ case let i: size =>
+ delete(s.items[i]);
+ return true;
+ case nosuchitem =>
+ return false;
+ };
+};
+
+export fn contains(s: set, item: size) (size | nosuchitem) = {
+ for (let i = 0z; i < len(s.items); i += 1) {
+ if (s.items[i] == item) {
+ return i;
+ };
+ };
+ return nosuchitem;
+};
+
+// Clears all items
+export fn clear(s: *set) void = {
+ delete(s.items[..]);
+};
+
+@test fn add() void = {
+ let s = set {...};
+ assert(add(&s, 1z));
+ assert(len(s.items) == 1);
+ assert(!add(&s, 1z));
+ assert(len(s.items) == 1);
+};
+
+@test fn del() void = {
+ let s = set {...};
+ assert(add(&s, 1z));
+ assert(len(s.items) == 1);
+ assert(del(&s, 1z));
+ assert(len(s.items) == 0);
+ assert(!del(&s, 1z));
+ assert(len(s.items) == 0);
+};
+
+@test fn contains() void = {
+ let s = set {...};
+ assert(add(&s, 1z));
+ assert(!add(&s, 1z));
+ const c = contains(s, 1z);
+ assert(c is size);
+ assert(c as size == 0);
+ assert(add(&s, 2z));
+ const c = contains(s, 2z);
+ assert(c is size);
+ assert(c as size == 1);
+};
+
+@test fn clear() void = {
+ let s = set {...};
+ assert(add(&s, 1z));
+ assert(len(s.items) == 1);
+ assert(!add(&s, 1z));
+ assert(len(s.items) == 1);
+ clear(&s);
+ assert(len(s.items) == 0);
+};