def route.loop
mylsm-lsm-store@0.6.0.1 · src/scan/ByteBlockReader.bend:889
import mylsm-lsm-store@0.6.0.1/src/scan/ByteBlockReader.bend as ByteBlockReader
import Base
import mylsm-lsm-store@0.6.0.1/src/ByteMemTable.bend as ByteMemTable
import mylsm-lsm-store@0.6.0.1/src/Fs.bend as Fs
import mylsm-lsm-store@0.6.0.1/src/SstStreamIo.bend as SstStreamIo
import mylsm-lsm-store@0.6.0.1/src/scan/BlockRoutePolicy.bend as BlockRoutePolicy
import bend-kit-bytes@0.3.2.0/bytes.bend as Bytes
889def route.loop(fuel: Nat, pending: RouteState) -> IO(Result<&1, &1, U32 & String, Reader>):
890 match fuel:
891 case 0n: route.exhausted(pending)
892 case 1n+rest:
893 match pending:
894 case RouteNeed{file, state, context, key, +search}:
895 do IO<Result<&1, &1, U32 & String, Reader>>:
896 next : RouteState <- route.need(file, state, context, key, search,
897 BlockRoutePolicy.active(search))
898 route.loop(rest, next)
899 case RouteSelect{reader, block}:
900 seek_block_after_validation(reader, U32.from_nat(block))
901 case RouteRecordRead{pair, state, context, key, search, mid}:
902 route.loop(rest, route.record.parsed(state, context, key, search,
903 mid, SstStreamIo.read.exact.state(pair)))
904 case RouteSeparatorNeed{file, state, context, key, search, mid,
905 offset, +length, separator_start}:
906 do IO<Result<&1, &1, U32 & String, Reader>>:
907 raw : File & Result<&1, &1, U32 & String, Bytes.Bytes> <-
908 Fs.read_at(file, U32.from_nat(Nat.add(separator_start, offset)),
909 length)
910 route.loop(rest, RouteSeparatorRead{
911 read_at.exact.pair(length, raw), state, context, key, search,
912 mid})
913 case RouteSeparatorRead{pair, state, context, key, search, mid}:
914 route.loop(rest, route.separator.parsed(state, context, key,
915 search, mid, SstStreamIo.read.exact.state(pair)))
916 case RouteCompare{file, state, context, key, search, mid, separator}:
917 route.loop(rest, route.compare.copies(file, state, context, search,
918 mid, separator, ByteMemTable.bytes.clone(key)))
919 case RouteFailed{file, error}: route.close.failed(file, error)