def snapshot.cursor.count.loop

mylsm-lsm-store@0.6.0.1 · src/coordinator/ByteClient.bend:532

import mylsm-lsm-store@0.6.0.1/src/coordinator/ByteClient.bend as ByteClient
import Base
import mylsm-lsm-store@0.6.0.1/src/coordinator/Client.bend as Client
import mylsm-lsm-store@0.6.0.1/src/coordinator/Protocol.bend as Protocol
import mylsm-lsm-store@0.6.0.1/src/coordinator/CursorCodec.bend as CursorCodec
import mylsm-lsm-store@0.6.0.1/src/coordinator/CursorCountPolicy.bend as CursorCountPolicy

532def snapshot.cursor.count.loop(
533  fuel: Nat,
534  state: SnapshotCountState
535) -> IO(Client.Session & Result<&1, &1, Client.Error, U32>):
536  match fuel:
537    case 0n:
538      snapshot.cursor.count.close.state(state,
539        Client.OwnerRejected{Protocol.ResponseResourceLimit{}})
540    case 1n+rest:
541      match state:
542        case SnapshotCountFrame{pair, cursor_id, count}:
543          match pair:
544            case (session, Fail{error}):
545              snapshot.cursor.count.close.resource(session, cursor_id, error)
546            case (session, Done{CursorCodec.CursorEnd{}}):
547              IO.pure(Client.Session & Result<&1, &1, Client.Error, U32>,
548                (session, Done{count}))
549            case (session, Done{CursorCodec.CursorItem{_, _}}):
550              snapshot.cursor.count.loop(rest, SnapshotCountItem{session,
551                cursor_id, CursorCountPolicy.next(count)})
552        case SnapshotCountItem{session, cursor_id, decision}:
553          match decision:
554            case CursorCountPolicy.CountLimit{}:
555              snapshot.cursor.count.close.resource(session, cursor_id,
556                Client.OwnerRejected{Protocol.ResponseResourceLimit{}})
557            case CursorCountPolicy.CountContinue{next_count}:
558              snapshot.cursor.count.loop(rest,
559                SnapshotCountNeed{session,
560                  CursorCountPolicy.u32.pair(cursor_id), next_count})
561        case SnapshotCountNeed{session, cursor_ids, count}:
562          match cursor_ids:
563            case (wire_id, retained_id):
564              do IO<Client.Session &
565                Result<&1, &1, Client.Error, U32>>:
566                next : Client.Session &
567                  Result<&1, &1, Client.Error, CursorCodec.Frame> <-
568                    snapshot.cursor.next(session, wire_id)
569                snapshot.cursor.count.loop(rest,
570                  SnapshotCountFrame{next, retained_id, count})

Uses (19)

Used by (1)