A Neovim plugin enabling you to solve LeetCode problems.
| 1 | local Group = require("leetcode-ui.group") |
| 2 | local Lines = require("leetcode-ui.lines") |
| 3 | local Case = require("leetcode-ui.group.case") |
| 4 | |
| 5 | local log = require("leetcode.logger") |
| 6 | |
| 7 | ---@class lc.ui.Cases : lc.ui.Group |
| 8 | ---@field cases table<integer, lc.ui.Case> |
| 9 | ---@field idx integer |
| 10 | ---@field console lc.ui.Console |
| 11 | local Cases = Group:extend("LeetCases") |
| 12 | |
| 13 | -- |
| 14 | return "leetcode_case_" -- |
| 15 | .. (self.idx == i and "focus_" or "") |
| 16 | .. (case.passed and "ok" or "err") |
| 17 | end |
| 18 | |
| 19 | |
| 20 | local nav = Lines({}, { padding = { top = 1 } }) |
| 21 | |
| 22 | for i, case in ipairs(self.cases) do |
| 23 | self.console.result:map("n", i, function() |
| 24 | self:change(i) |
| 25 | end, { clearable = true }) |
| 26 | |
| 27 | local hl = self:nav_case_hl(case, i) |
| 28 | local msg = (" Case (%d) "):format(i) |
| 29 | |
| 30 | nav:append(msg, hl) |
| 31 | if i ~= #self.cases then |
| 32 | nav:append(" ") |
| 33 | end |
| 34 | end |
| 35 | |
| 36 | return nav |
| 37 | end |
| 38 | |
| 39 | |
| 40 | self:replace({ |
| 41 | self:make_nav(), |
| 42 | self.cases[self.idx], |
| 43 | }) |
| 44 | |
| 45 | Cases.super.draw(self, layout) |
| 46 | end |
| 47 | |
| 48 | ---@param idx integer |
| 49 | |
| 50 | if not self.cases[idx] or idx == self.idx then |
| 51 | return |
| 52 | end |
| 53 | |
| 54 | self.idx = idx |
| 55 | self.console.result:draw() |
| 56 | end |
| 57 | |
| 58 | ---@param item lc.runtime |
| 59 | ---@param parent lc.ui.Console |
| 60 | ---@return lc.ui.Cases |
| 61 | |
| 62 | Cases.super.init(self, {}, { spacing = 1 }) |
| 63 | |
| 64 | self.cases = {} |
| 65 | self.console = parent |
| 66 | |
| 67 | local total = item.total_testcases ~= vim.NIL and item.total_testcases or 0 |
| 68 | local testcases = parent.testcase:by_id(item.submission_id) |
| 69 | |
| 70 | for i = 1, total do |
| 71 | self.cases[i] = Case({ |
| 72 | input = testcases[i], |
| 73 | output = item.code_answer[i], |
| 74 | expected = item.expected_code_answer[i], |
| 75 | std_output = item.std_output_list[i], |
| 76 | }, item.compare_result:sub(i, i) == "1", parent.question) |
| 77 | end |
| 78 | |
| 79 | self:change(1) |
| 80 | end |
| 81 | |
| 82 | ---@type fun(item: lc.runtime, parent: lc.ui.Console): lc.ui.Cases |
| 83 | local LeetCases = Cases |
| 84 | |
| 85 | return LeetCases |