local backingList = {} local paginationOffset = 1 local frame = term.current() local drawLine = nil local function setTerm(termlike) frame = termlike end local function setDrawLineFunc(drawLineFunc) drawLine = drawLineFunc end local function redrawLine(idx) if drawLine then local tw, th = frame.getSize() if idx >= paginationOffset and idx-paginationOffset <= th then frame.setCursorPos(1,idx-paginationOffset+1) drawLine(frame, backingList[idx]) end end end local function itemAt(idx) return backingList[idx] end local function updateItemAt(idx, item) backingList[idx] = item redrawLine(idx) end local function redraw() if drawLine then local tw, th = frame.getSize() local backingIdx = paginationOffset for idx = 1, th, 1 do if backingList[backingIdx] ~= nil then frame.setCursorPos(idx) drawLine(frame, backingList[backingIdx]) end end end end local function updatePage(newOffset) if newOffset ~= paginationOffset then paginationOffset = newOffset redraw() end end return { setTerm=setTerm, setDrawLineFunc=setDrawLineFunc, itemAt=itemAt, updateItemAt=updateItemAt, redraw=redraw, updatePage=updatePage, }