def read.loop
mylsm-lsm-store@0.6.0.1 · src/ByteSstIo.bend:184
import mylsm-lsm-store@0.6.0.1/src/ByteSstIo.bend as ByteSstIo
import Base
import mylsm-lsm-store@0.6.0.1/src/ByteMemTable.bend as ByteMemTable
import mylsm-lsm-store@0.6.0.1/src/scan/ByteBlockReader.bend as ByteBlockReader
184def read.loop(fuel: Nat, state: ReadState) -> IO(Result<&1, &1, U32 & String, ByteMemTable.Table>):
185 match fuel:
186 case 0n:
187 match state:
188 case ReadNeed{reader, _}:
189 do IO<Result<&1, &1, U32 & String, ByteMemTable.Table>>:
190 _closed : Result<&1, &1, U32 & String, Unit> <- ByteBlockReader.close(reader)
191 return Fail{corruption("byte SST block count exceeded reader limit")}
192 case ReadStep{result, _}:
193 match result:
194 case Done{ByteBlockReader.Block{reader, _}}:
195 do IO<Result<&1, &1, U32 & String, ByteMemTable.Table>>:
196 _closed : Result<&1, &1, U32 & String, Unit> <- ByteBlockReader.close(reader)
197 return Fail{corruption("byte SST block count exceeded reader limit")}
198 case _: IO.pure(Result<&1, &1, U32 & String, ByteMemTable.Table>,
199 Fail{corruption("byte SST reader exhausted its transition limit")})
200 case 1n+rest:
201 match state:
202 case ReadNeed{reader, table}:
203 do IO<Result<&1, &1, U32 & String, ByteMemTable.Table>>:
204 result : Result<&1, &1, U32 & String, ByteBlockReader.Step> <-
205 ByteBlockReader.next(reader)
206 read.loop(rest, ReadStep{result, table})
207 case ReadStep{result, table}:
208 match result:
209 case Fail{error}:
210 IO.pure(Result<&1, &1, U32 & String, ByteMemTable.Table>, Fail{error})
211 case Done{ByteBlockReader.End{}}:
212 IO.pure(Result<&1, &1, U32 & String, ByteMemTable.Table>, Done{table})
213 case Done{ByteBlockReader.Block{reader, entries}}:
214 read.loop(rest, ReadNeed{reader, read.fold(entries, table)})