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

Uses (26)

Used by (1)