def read.loop
mylsm-lsm-store@0.6.0.1 · src/SstStreamIo.bend:326
import mylsm-lsm-store@0.6.0.1/src/SstStreamIo.bend as SstStreamIo
import Base
import mylsm-lsm-store@0.6.0.1/src/Sstable.bend as Sstable
import mylsm-lsm-store@0.6.0.1/src/SstFile.bend as SstFile
326def read.loop(fuel: Nat, state: StreamReadState) -> IO(Result<&1, &1, U32 & String, Sstable.Table>):
327 match fuel:
328 case 0n:
329 read.exhausted(state)
330 case 1n+rest:
331 match state:
332 case ReadHeader{file, size}:
333 do IO<Result<&1, &1, U32 & String, Sstable.Table>>:
334 pair : File & Result<&1, &1, U32 & String, ExactResult> <- exact.start(file, 20n)
335 read.loop(rest, read.header.state(read.exact.state(pair), size))
336 case ReadHeaderResult{pair, size}:
337 read.loop(rest, read.header.state(pair, size))
338 case ReadBlocks{file, size, used, parser}:
339 match parser:
340 case SstFile.StreamState{_, _, _, 0, _, _, _, _}:
341 do IO<Result<&1, &1, U32 & String, Sstable.Table>>:
342 pair : File & Result<&1, &1, U32 & String, ExactResult> <- exact.start(file, 40n)
343 read.loop(rest, read.footer.state(read.exact.state(pair),
344 size, used, parser))
345 case SstFile.StreamState{+level, +total, +block_count, +remaining,
346 +entries_left, +previous, entries, hashes}:
347 do IO<Result<&1, &1, U32 & String, Sstable.Table>>:
348 pair : File & Result<&1, &1, U32 & String, ExactResult> <- exact.start(file, 8n)
349 read.loop(rest, read.block.header.state(read.exact.state(pair),
350 size, used, SstFile.StreamState{level, total, block_count,
351 remaining, entries_left, previous, entries, hashes}))
352 case ReadBlockHeaderResult{pair, size, used, parser}:
353 read.loop(rest, read.block.header.state(pair, size, used, parser))
354 case ReadBlockBody{file, size, used, parser, header, +tail_len}:
355 do IO<Result<&1, &1, U32 & String, Sstable.Table>>:
356 pair : File & Result<&1, &1, U32 & String, ExactResult> <-
357 exact.start(file, U32.to_nat(tail_len))
358 read.loop(rest, ReadBlockBodyResult{read.exact.state(pair),
359 size, used, parser, header, tail_len})
360 case ReadBlockBodyResult{pair, size, used, parser, header, tail_len}:
361 read.loop(rest, read.block.body.state(pair, size, used, parser,
362 header, tail_len))
363 case ReadFooterResult{pair, size, used, parser}:
364 read.loop(rest, read.footer.state(pair, size, used, parser))
365 case ReadClose{file, result}:
366 do IO<Result<&1, &1, U32 & String, Sstable.Table>>:
367 _closed : Unit <- File.close(file)
368 return result