def blocks.pack.go
mylsm-lsm-store@0.6.0.1 · src/SstFile.bend:296
import mylsm-lsm-store@0.6.0.1/src/SstFile.bend as SstFile
import Base
import mylsm-lsm-store@0.6.0.1/src/MemTable.bend as MemTable
import mylsm-lsm-store@0.6.0.1/src/StorageBytes.bend as StorageBytes
296
297def blocks.pack.go(
298 entries: List<&2, MemTable.Entry>,
299 current: List<&2, MemTable.Entry>,
300 +size: U32,
301 acc: List<&2, List<&2, MemTable.Entry>>,
302 measured: BlockMeasure
303) -> List<&2, List<&2, MemTable.Entry>>:
304 match entries:
305 case Nil{}:
306 blocks.pack.finish(current, acc)
307 case Con{entry, +rest}:
308 match current:
309 case Nil{}:
310 match measured:
311 case InvalidRecord{}:
312 blocks.pack.go(rest, Con{entry, Nil{}}, StorageBytes.MAX_BLOCK_BYTES(), acc,
313 blocks.measure.next(rest, StorageBytes.MAX_BLOCK_BYTES()))
314 case Measured{+length, fits}:
315 blocks.pack.go(rest, Con{entry, Nil{}}, length, acc,
316 blocks.measure.next(rest, length))
317 case Con{_, _}:
318 match measured:
319 case InvalidRecord{}:
320 blocks.pack.go(rest, Con{entry, Nil{}}, StorageBytes.MAX_BLOCK_BYTES(),
321 Con{List.reverse(&2, MemTable.Entry, current), acc},
322 blocks.measure.next(rest, StorageBytes.MAX_BLOCK_BYTES()))
323 case Measured{+length, False{}}:
324 blocks.pack.go(rest, Con{entry, Nil{}}, length,
325 Con{List.reverse(&2, MemTable.Entry, current), acc},
326 blocks.measure.next(rest, length))
327 case Measured{+length, True{}}:
328 blocks.pack.go(rest, Con{entry, current}, (size + length : U32), acc,
329 blocks.measure.next(rest, (size + length : U32)))