src/scan/Cursor.bend
mylsm-lsm-store@0.6.0.0 · 39 lines · 0 definitions
1import Base
2import mylsm-lsm-store@0.6.0.0/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}