Nasal-Interpreter/std/list.nas

77 lines
1.7 KiB
Plaintext

# list.nas
# valkmjolnir 2021/3/31
var new = func() {
var (begin, end, len) = (nil, nil, 0);
return {
push_back: func(elem) {
var tmp = {
elem: elem,
prev: nil,
next: nil
};
if (end!=nil) {
end.next = tmp;
tmp.prev = end;
end = tmp;
} else {
begin = end = tmp;
}
len += 1;
},
push_front: func(elem) {
var tmp = {
elem: elem,
prev: nil,
next: nil
};
if (begin!=nil) {
begin.prev = tmp;
tmp.next = begin;
begin = tmp;
} else {
begin = end = tmp;
}
len += 1;
},
pop_back: func() {
if (end!=nil) {
end = end.prev;
}
if (end==nil) {
begin = nil;
} else {
end.next = nil;
}
if (len) {
len -= 1;
}
},
pop_front: func() {
if (begin!=nil) {
begin = begin.next;
}
if (begin==nil) {
end = nil;
} else {
begin.prev = nil;
}
if (len) {
len -= 1;
}
},
front: func() {
if (begin!=nil) {
return begin.elem;
}
},
back: func() {
if (end!=nil) {
return end.elem;
}
},
length: func() {
return len;
}
};
}