From d99434ac43a61d618baf64f1c58b77acbfe94613 Mon Sep 17 00:00:00 2001 From: Felix Van der Jeugt Date: Mon, 6 Dec 2021 21:37:34 +0100 Subject: [PATCH] will be needing a deque later --- deque.lua | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 deque.lua diff --git a/deque.lua b/deque.lua new file mode 100644 index 0000000..8d8a4c7 --- /dev/null +++ b/deque.lua @@ -0,0 +1,81 @@ +function deque() + local cap = 5 + local elems = {} + for i = 0, cap - 1 do + elems[i] = nil + end + return { + start = 0, + size = 0, + cap = cap, + elems = elems, + pprint = pprint, + pop = pop, + prepend = prepend, + append = append, + popleft = popleft, + } +end + +function pprint(self) + io.write(self.start .. "->" .. self.size .. ": ") + local i = self.start + for i = 0, self.cap - 1 do + io.write((self.elems[i] or "_") .. " ") + end + io.write("\n") +end + +local function extend(self) + local copy = {} + for i = 0, self.size - 1 do + copy[i] = self.elems[(self.start + i) % self.size] + end + for i = self.size, 2 * self.size - 1 do + copy[i] = nil + end + self.elems = copy + self.start = 0 + self.cap = self.cap * 2 +end + +function append(self, n) + if self.size == self.cap then + extend(self) + end + self.elems[(self.start + self.size) % self.cap] = n + self.size = self.size + 1 +end + +function pop(self) + if self.size > 0 then + local i = (self.start + self.size - 1) % self.cap + local v = self.elems[i] + self.elems[i] = nil + self.size = self.size - 1 + return v + else + return nil + end +end + +function prepend(self, n) + if self.size == self.cap then + extend(self) + end + self.size = self.size + 1 + self.start = (self.start + self.cap - 1) % self.cap + self.elems[self.start] = n +end + +function popleft(self) + if self.size > 0 then + local v = self.elems[self.start] + self.elems[self.start] = nil + self.start = (self.start + 1) % self.cap + self.size = self.size - 1 + return v + else + return nil + end +end