1
1
mirror of https://github.com/kanaka/mal.git synced 2024-08-17 09:40:21 +03:00
mal/impls/zig/linked_list.zig
Joel Martin 8a19f60386 Move implementations into impls/ dir
- Reorder README to have implementation list after "learning tool"
  bullet.

- This also moves tests/ and libs/ into impls. It would be preferrable
  to have these directories at the top level.  However, this causes
  difficulties with the wasm implementations which need pre-open
  directories and have trouble with paths starting with "../../". So
  in lieu of that, symlink those directories to the top-level.

- Move the run_argv_test.sh script into the tests directory for
  general hygiene.
2020-02-10 23:50:16 -06:00

59 lines
1.6 KiB
Zig

const Allocator = @import("std").mem.Allocator;
const TailQueue = @import("std").TailQueue;
const ArrayList = @import("std").ArrayList;
const MalType = @import("types.zig").MalType;
const MalError = @import("error.zig").MalError;
pub const MalLinkedList = ArrayList(*MalType);
pub fn deepcopy(allocator: *Allocator, ll: MalLinkedList) MalError!MalLinkedList {
var new_ll = MalLinkedList.init(allocator);
const ll_slice = ll.toSlice();
var i: usize = 0;
while(i < ll_slice.len) {
const new_mal = try ll_slice[i].copy(allocator);
new_ll.append(new_mal) catch return MalError.SystemError;
i += 1;
}
return new_ll;
}
pub fn destroy(allocator: *Allocator, ll: *MalLinkedList, shallow: bool) void {
if(!shallow) {
const ll_slice = ll.toSlice();
var i: usize = 0;
while(i < ll_slice.len) {
ll_slice[i].delete(allocator);
i += 1;
}
}
ll.deinit();
}
// TODO: deprecate
pub fn append_mal(allocator: *Allocator, ll: *MalLinkedList, mal: *MalType) MalError!void {
ll.append(mal) catch return MalError.SystemError;
}
// TODO: deprecate
pub fn prepend_mal(allocator: *Allocator, ll: *MalLinkedList, mal: *MalType) MalError!void {
ll.insert(0, mal) catch return MalError.SystemError;
}
pub fn pop_first(allocator: *Allocator, ll: *MalLinkedList) MalError!*MalType {
if(ll.count() == 0) {
return MalError.OutOfBounds;
}
return ll.orderedRemove(0);
}
pub fn first(ll: *const MalLinkedList) ?*MalType {
if(ll.count() == 0) {
return null;
}
return ll.at(0);
}