@tanstack/ai
Version:
Type-safe TypeScript AI SDK for streaming chat, tool calling, agents, structured outputs, and multimodal generation.
55 lines (54 loc) • 1.95 kB
JavaScript
function entryToSeconds(entry) {
if (typeof entry === "number") {
return Number.isFinite(entry) ? entry : null;
}
const stripped = entry.endsWith("s") ? entry.slice(0, -1) : entry;
const parsed = Number(stripped);
return Number.isFinite(parsed) ? parsed : null;
}
function snapToDurationOption(seconds, options) {
switch (options.kind) {
case "none":
return void 0;
case "discrete": {
return pickClosestDiscrete(seconds, options.values);
}
case "range": {
const step = options.step ?? 1;
const clamped = Math.min(options.max, Math.max(options.min, seconds));
const snapped = Math.round((clamped - options.min) / step) * step + options.min;
return Math.min(options.max, Math.max(options.min, snapped));
}
case "mixed": {
const discreteCandidate = pickClosestDiscrete(seconds, options.values);
if (!options.range) return discreteCandidate;
const { min, max, step = 1 } = options.range;
const clamped = Math.min(max, Math.max(min, seconds));
const rangeValue = Math.min(
max,
Math.max(min, Math.round((clamped - min) / step) * step + min)
);
const discreteSeconds = typeof discreteCandidate === "number" ? discreteCandidate : discreteCandidate !== void 0 ? entryToSeconds(discreteCandidate) ?? Infinity : Infinity;
return Math.abs(discreteSeconds - seconds) <= Math.abs(rangeValue - seconds) ? discreteCandidate : rangeValue;
}
}
}
function pickClosestDiscrete(seconds, values) {
if (values.length === 0) return void 0;
let best;
let bestDistance = Infinity;
for (const value of values) {
const v = entryToSeconds(value);
if (v === null) continue;
const distance = Math.abs(v - seconds);
if (distance < bestDistance) {
bestDistance = distance;
best = value;
}
}
return best ?? values[0];
}
export {
snapToDurationOption
};
//# sourceMappingURL=snap.js.map