parsing.ts•1.62 kB
export function splitNumbers(
str: string | undefined,
delimiter: string,
expectedCount: number
): number[] | null {
if (!str) return null;
const parts = str.split(delimiter).map(s => s.trim()).filter(Boolean);
if (parts.length < expectedCount) return null;
const numbers = parts.slice(0, expectedCount).map(Number);
if (numbers.some(isNaN)) return null;
return numbers;
}
export function parsePair(
str: string | undefined,
defaults: [number, number] = [0, 0]
): [number, number] {
const result = splitNumbers(str, ' ', 2);
if (!result) return defaults;
return [result[0], result[1]];
}
export function parseTriple(
str: string | undefined,
defaults: [number, number, number] = [1, 1, 1]
): [number, number, number] {
const result = splitNumbers(str, ' ', 3);
if (!result) return defaults;
return [result[0], result[1], result[2]];
}
export function arrayAt<T>(
arr: T[] | undefined,
index: number,
defaultValue: T
): T {
if (!arr || index < 0 || index >= arr.length) return defaultValue;
return arr[index];
}
export function last<T>(arr: T[] | undefined): T | undefined {
if (!arr || arr.length === 0) return undefined;
return arr[arr.length - 1];
}
export function captureGroup(
str: string,
pattern: RegExp,
groupIndex: number = 1
): string | null {
const match = str.match(pattern);
if (!match || match.length <= groupIndex) return null;
return match[groupIndex];
}
export function parsePenetration(str: string | undefined): number {
if (!str) return 0;
const values = str.split(' ').filter(Boolean).map(Number);
return values[0] ?? 0;
}