diff options
| author | Julian Hurst <julian.hurst92@gmail.com> | 2022-05-15 01:36:43 +0200 |
|---|---|---|
| committer | Julian Hurst <julian.hurst92@gmail.com> | 2022-05-15 01:36:43 +0200 |
| commit | 35639332a5dc8e9b26e8299c999940a9b6ca2ddb (patch) | |
| tree | 909bdfc2f6354aa25721ac67e9441c430d3b46e6 /set | |
| parent | 1aece8326ee62e242f308c3dbeb5f2bb5e2d53b9 (diff) | |
| download | ilhare-35639332a5dc8e9b26e8299c999940a9b6ca2ddb.tar.gz | |
Add marking support (contains, fnmatch, regex)
Diffstat (limited to 'set')
| -rw-r--r-- | set/set.ha | 80 |
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); +}; |
