src/scan/Cursor.bend

mylsm-lsm-store@0.6.0.1 · 39 lines · 5 definitions

1import Base
2import mylsm-lsm-store@0.6.0.1/src/ByteMemTable.bend as ByteMemTable
3
4# Owns the unread suffix of one ordered byte-entry source.
5type 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.
12type 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.
18def open(entries: List<&1, ByteMemTable.Entry>) -> Cursor:
19  CursorReady{entries}
20
21# Returns at most one entry and retains the remaining source suffix.
22def 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.
34def 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}