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)

Uses (25)

Used by (1)