diff options
Diffstat (limited to 'set/set.ha')
| -rw-r--r-- | set/set.ha | 85 |
1 files changed, 0 insertions, 85 deletions
diff --git a/set/set.ha b/set/set.ha deleted file mode 100644 index 504d716..0000000 --- a/set/set.ha +++ /dev/null @@ -1,85 +0,0 @@ -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[..]); -}; - -// Free the underlying slice. -export fn finish(s: *set) void = { - free(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); -}; |
