1 import Base 2 import ../ByteMemTable.bend as ByteMemTable 3 4 # Owns the unread suffix of one ordered byte-entry source. 5 type Cursor is Type: 6 CursorReady{entries: List<&1, ByteMemTable.Entry>} 7 CursorEnded{} 8 CursorClosed{} 9 CursorFailed{code: U32, message: String} 10 11 # Returns one entry, terminal end, or terminal cursor error. 12 type Step is Type: 13 CursorItem{entry: ByteMemTable.Entry, cursor: Cursor} 14 CursorEnd{cursor: Cursor} 15 CursorError{cursor: Cursor} 16 17 # Creates a cursor over an already ordered bounded source. 18 def open(entries: List<&1, ByteMemTable.Entry>) -> Cursor: 19 CursorReady{entries} 20 21 # Returns at most one entry and retains the remaining source suffix. 22 def next(cursor: Cursor) -> Step: 23 match cursor: 24 case CursorReady{entries}: 25 match entries: 26 case Nil{}: CursorEnd{CursorEnded{}} 27 case Con{entry, tail}: CursorItem{entry, CursorReady{tail}} 28 case CursorEnded{}: CursorEnd{CursorEnded{}} 29 case CursorClosed{}: CursorEnd{CursorClosed{}} 30 case CursorFailed{code, message}: 31 CursorError{CursorFailed{code, message}} 32 33 # Closes an active cursor while preserving terminal outcomes. 34 def close(cursor: Cursor) -> Cursor: 35 match cursor: 36 case CursorReady{_}: CursorClosed{} 37 case CursorEnded{}: CursorEnded{} 38 case CursorClosed{}: CursorClosed{} 39 case CursorFailed{code, message}: CursorFailed{code, message}