← Singleton lesson
Lab

Singleton

Sign in to run your code

Read the brief and the starter here. With a free account you can edit it, run the sample, step through it and check your work, and your progress is kept.

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() };
}