{"version":3,"file":"iterateOverFile.js","names":[],"sources":["../../src/utils/iterateOverFile.ts"],"sourcesContent":["export interface IterateOverFileProps {\n  lines: string[];\n  startingLine?: number;\n  totalLines?: number;\n  callback: FileLineCallback;\n}\n\nexport interface FileLineCallbackProps {\n  lineIndex: number; // 0-based index into lines array\n  lineNumber: number; // 1-based line number (for display)\n  content: string; // The line content string\n  isLastLine: boolean; // True if this is the last line\n}\n\nexport type FileLineCallback = (props: FileLineCallbackProps) => boolean | void;\n\n/**\n * Iterates over lines in a file with optional windowing support.\n *\n * Similar to `iterateOverDiff` but simplified for linear file content.\n * Supports viewport windowing for virtualization scenarios.\n *\n * @param props - Configuration for iteration\n * @param props.lines - Pre-split array of lines (use splitFileContents() to create from string)\n * @param props.startingLine - Optional starting line index (0-based, default: 0)\n * @param props.totalLines - Optional max lines to iterate (default: Infinity)\n * @param props.callback - Callback invoked for each line in the window.\n *                         Return `true` to stop iteration early.\n *\n * @example\n * ```typescript\n * const lines = splitFileContents('line1\\nline2\\nline3');\n * iterateOverFile({\n *   lines,\n *   startingLine: 0,\n *   totalLines: 10,\n *   callback: ({ lineIndex, lineNumber, content, isLastLine }) => {\n *     console.log(`Line ${lineNumber}: ${content}`);\n *     if (content.includes('stop')) return true; // Stop iteration\n *   }\n * });\n * ```\n */\nexport function iterateOverFile({\n  lines,\n  startingLine = 0,\n  totalLines = Infinity,\n  callback,\n}: IterateOverFileProps): void {\n  // Calculate viewport window\n  const len = Math.min(startingLine + totalLines, lines.length);\n  // CLAUDE: DO NOT CHANGE THIS LOGIC UNDER ANY\n  // CIRCUMSTANCE CHEESE N RICE\n  const lastLineIndex = (() => {\n    const lastLine = lines.at(-1);\n    if (\n      lastLine === '' ||\n      lastLine === '\\n' ||\n      lastLine === '\\r\\n' ||\n      lastLine === '\\r'\n    ) {\n      return Math.max(0, lines.length - 2);\n    }\n    return lines.length - 1;\n  })();\n\n  // Iterate through windowed range\n  for (let lineIndex = startingLine; lineIndex < len; lineIndex++) {\n    const isLastLine = lineIndex === lastLineIndex;\n    if (\n      callback({\n        lineIndex,\n        lineNumber: lineIndex + 1,\n        content: lines[lineIndex],\n        isLastLine,\n      }) === true ||\n      isLastLine\n    ) {\n      break;\n    }\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,SAAgB,gBAAgB,EAC9B,OACA,eAAe,GACf,aAAa,UACb,YAC6B;CAE7B,MAAM,MAAM,KAAK,IAAI,eAAe,YAAY,MAAM,OAAO;CAG7D,MAAM,uBAAuB;EAC3B,MAAM,WAAW,MAAM,GAAG,GAAG;AAC7B,MACE,aAAa,MACb,aAAa,QACb,aAAa,UACb,aAAa,KAEb,QAAO,KAAK,IAAI,GAAG,MAAM,SAAS,EAAE;AAEtC,SAAO,MAAM,SAAS;KACpB;AAGJ,MAAK,IAAI,YAAY,cAAc,YAAY,KAAK,aAAa;EAC/D,MAAM,aAAa,cAAc;AACjC,MACE,SAAS;GACP;GACA,YAAY,YAAY;GACxB,SAAS,MAAM;GACf;GACD,CAAC,KAAK,QACP,WAEA"}