def loop

mylsm-lsm-store@0.6.0.1 · src/transfer/BackupOwnerCursorIo.bend:226

import mylsm-lsm-store@0.6.0.1/src/transfer/BackupOwnerCursorIo.bend as BackupOwnerCursorIo
import Base
import mylsm-lsm-store@0.6.0.1/src/Fs.bend as Fs
import mylsm-lsm-store@0.6.0.1/src/transfer/BackupCursor.bend as BackupCursor
import mylsm-lsm-store@0.6.0.1/src/transfer/BackupIo.bend as BackupIo
import mylsm-lsm-store@0.6.0.1/src/transfer/Backup.bend as Backup

226# Advances backup IO state without reading beyond its declared work budget.
227def loop(
228  fuel: Nat,
229  +destination: String,
230  +temporary: String,
231  state: State
232) -> IO(Result<&1, &1, BackupIo.Error, Unit>):
233  match fuel:
234    case 0n: loop.abort(temporary, state)
235    case 1n+rest:
236      match state:
237        case Need{file, source, stream}:
238          do IO<Result<&1, &1, BackupIo.Error, Unit>>:
239            advanced : State <- source.step(source, stream, file)
240            loop(rest, destination, temporary, advanced)
241        case Output{file, source, step}:
242          match step:
243            case BackupCursor.Failure{_, error}:
244              close.failed.source(file, temporary, source, error)
245            case BackupCursor.Continue{stream}:
246              loop(rest, destination, temporary, Need{file, source, stream})
247            case BackupCursor.Chunk{stream, bytes}:
248              do IO<Result<&1, &1, BackupIo.Error, Unit>>:
249                written : File & Result<&1, &1, U32 & String, Unit> <-
250                  Fs.write_bytes(file, bytes)
251                loop(rest, destination, temporary,
252                  Written{written, source, stream})
253            case BackupCursor.End{}:
254              close.success(destination, temporary, file, source)
255        case Written{pair, source, stream}:
256          match pair:
257            case (file, Fail{(code, message)}):
258              close.failed.source(file, temporary, source,
259                Backup.SourceFailure{code, message})
260            case (file, Done{Unit{}}):
261              loop(rest, destination, temporary, Need{file, source, stream})

Uses (19)

Used by (1)