Lab
Singleton
type FrameSequence = { nextFrame(): number };
// Provided: numbers frames from `first` up, one per call.
function createSequence(first: number): FrameSequence {
let last = first - 1;
return { nextFrame: () => ++last };
}
type CaptureSession = { firstFrame: number };
// Opens a capture session that numbers its frames from firstFrame.
function startSession(firstFrame: number): CaptureSession {
if (!Number.isInteger(firstFrame) || firstFrame < 1) {
throw new Error(`first frame must be a positive integer: ${firstFrame}`);
}
return { firstFrame };
}
// The acquisition panel numbers each frame it takes.
function createPanel(session: CaptureSession) {
const sequence = createSequence(session.firstFrame);
return { frame: () => sequence.nextFrame() };
}
// The file recorder numbers each frame it saves.
function createRecorder(session: CaptureSession) {
const sequence = createSequence(session.firstFrame);
return { frame: () => sequence.nextFrame() };
}