Skip to content

@kaiord/core


@kaiord/core / isRepetitionBlock

Function: isRepetitionBlock()

isRepetitionBlock(step): step is { id?: string; repeatCount: number; steps: { duration: { seconds: number; type: "time" } | { meters: number; type: "distance" } | { bpm: number; type: "heart_rate_less_than" } | { bpm: number; repeatFrom: number; type: "repeat_until_heart_rate_greater_than" } | { calories: number; type: "calories" } | { type: "power_less_than"; watts: number } | { type: "power_greater_than"; watts: number } | { repeatFrom: number; seconds: number; type: "repeat_until_time" } | { meters: number; repeatFrom: number; type: "repeat_until_distance" } | { calories: number; repeatFrom: number; type: "repeat_until_calories" } | { bpm: number; repeatFrom: number; type: "repeat_until_heart_rate_less_than" } | { repeatFrom: number; type: "repeat_until_power_less_than"; watts: number } | { repeatFrom: number; type: "repeat_until_power_greater_than"; watts: number } | { type: "open" }; durationType: "time" | "distance" | "heart_rate_less_than" | "repeat_until_heart_rate_greater_than" | "calories" | "power_less_than" | "power_greater_than" | "repeat_until_time" | "repeat_until_distance" | "repeat_until_calories" | "repeat_until_heart_rate_less_than" | "repeat_until_power_less_than" | "repeat_until_power_greater_than" | "open"; equipment?: "none" | "swim_fins" | "swim_kickboard" | "swim_paddles" | "swim_pull_buoy" | "swim_snorkel"; extensions?: Record<string, unknown>; intensity?: "warmup" | "active" | "cooldown" | "rest" | "recovery" | "interval" | "other"; name?: string; notes?: string; stepIndex: number; target: { type: "power"; value: { unit: "watts"; value: number } | { unit: "percent_ftp"; value: number } | { unit: "zone"; value: number } | { max: number; min: number; unit: "range" } } | { type: "heart_rate"; value: { unit: "bpm"; value: number } | { unit: "zone"; value: number } | { unit: "percent_max"; value: number } | { max: number; min: number; unit: "range" } } | { type: "cadence"; value: { unit: "rpm"; value: number } | { max: number; min: number; unit: "range" } } | { type: "pace"; value: { unit: "mps"; value: number } | { unit: "zone"; value: number } | { max: number; min: number; unit: "range" } } | { type: "stroke_type"; value: { unit: "swim_stroke"; value: number } } | { type: "open" }; targetType: "cadence" | "power" | "open" | "heart_rate" | "pace" | "stroke_type" }[] }

Defined in: packages/core/src/domain/type-guards.ts:9

Type guard to check if a workout step is a RepetitionBlock.

Checks for both repeatCount and steps properties to reliably discriminate between WorkoutStep and RepetitionBlock union members.

Parameters

step

{ duration: { seconds: number; type: "time"; } | { meters: number; type: "distance"; } | { bpm: number; type: "heart_rate_less_than"; } | { bpm: number; repeatFrom: number; type: "repeat_until_heart_rate_greater_than"; } | { calories: number; type: "calories"; } | { type: "power_less_than"; watts: number; } | { type: "power_greater_than"; watts: number; } | { repeatFrom: number; seconds: number; type: "repeat_until_time"; } | { meters: number; repeatFrom: number; type: "repeat_until_distance"; } | { calories: number; repeatFrom: number; type: "repeat_until_calories"; } | { bpm: number; repeatFrom: number; type: "repeat_until_heart_rate_less_than"; } | { repeatFrom: number; type: "repeat_until_power_less_than"; watts: number; } | { repeatFrom: number; type: "repeat_until_power_greater_than"; watts: number; } | { type: "open"; }; durationType: "time" | "distance" | "heart_rate_less_than" | "repeat_until_heart_rate_greater_than" | "calories" | "power_less_than" | "power_greater_than" | "repeat_until_time" | "repeat_until_distance" | "repeat_until_calories" | "repeat_until_heart_rate_less_than" | "repeat_until_power_less_than" | "repeat_until_power_greater_than" | "open"; equipment?: "none" | "swim_fins" | "swim_kickboard" | "swim_paddles" | "swim_pull_buoy" | "swim_snorkel"; extensions?: Record<string, unknown>; intensity?: "warmup" | "active" | "cooldown" | "rest" | "recovery" | "interval" | "other"; name?: string; notes?: string; stepIndex: number; target: { type: "power"; value: { unit: "watts"; value: number; } | { unit: "percent_ftp"; value: number; } | { unit: "zone"; value: number; } | { max: number; min: number; unit: "range"; }; } | { type: "heart_rate"; value: { unit: "bpm"; value: number; } | { unit: "zone"; value: number; } | { unit: "percent_max"; value: number; } | { max: number; min: number; unit: "range"; }; } | { type: "cadence"; value: { unit: "rpm"; value: number; } | { max: number; min: number; unit: "range"; }; } | { type: "pace"; value: { unit: "mps"; value: number; } | { unit: "zone"; value: number; } | { max: number; min: number; unit: "range"; }; } | { type: "stroke_type"; value: { unit: "swim_stroke"; value: number; }; } | { type: "open"; }; targetType: "cadence" | "power" | "open" | "heart_rate" | "pace" | "stroke_type"; } | { id?: string; repeatCount: number; steps: object[]; }

Returns

step is { id?: string; repeatCount: number; steps: { duration: { seconds: number; type: "time" } | { meters: number; type: "distance" } | { bpm: number; type: "heart_rate_less_than" } | { bpm: number; repeatFrom: number; type: "repeat_until_heart_rate_greater_than" } | { calories: number; type: "calories" } | { type: "power_less_than"; watts: number } | { type: "power_greater_than"; watts: number } | { repeatFrom: number; seconds: number; type: "repeat_until_time" } | { meters: number; repeatFrom: number; type: "repeat_until_distance" } | { calories: number; repeatFrom: number; type: "repeat_until_calories" } | { bpm: number; repeatFrom: number; type: "repeat_until_heart_rate_less_than" } | { repeatFrom: number; type: "repeat_until_power_less_than"; watts: number } | { repeatFrom: number; type: "repeat_until_power_greater_than"; watts: number } | { type: "open" }; durationType: "time" | "distance" | "heart_rate_less_than" | "repeat_until_heart_rate_greater_than" | "calories" | "power_less_than" | "power_greater_than" | "repeat_until_time" | "repeat_until_distance" | "repeat_until_calories" | "repeat_until_heart_rate_less_than" | "repeat_until_power_less_than" | "repeat_until_power_greater_than" | "open"; equipment?: "none" | "swim_fins" | "swim_kickboard" | "swim_paddles" | "swim_pull_buoy" | "swim_snorkel"; extensions?: Record<string, unknown>; intensity?: "warmup" | "active" | "cooldown" | "rest" | "recovery" | "interval" | "other"; name?: string; notes?: string; stepIndex: number; target: { type: "power"; value: { unit: "watts"; value: number } | { unit: "percent_ftp"; value: number } | { unit: "zone"; value: number } | { max: number; min: number; unit: "range" } } | { type: "heart_rate"; value: { unit: "bpm"; value: number } | { unit: "zone"; value: number } | { unit: "percent_max"; value: number } | { max: number; min: number; unit: "range" } } | { type: "cadence"; value: { unit: "rpm"; value: number } | { max: number; min: number; unit: "range" } } | { type: "pace"; value: { unit: "mps"; value: number } | { unit: "zone"; value: number } | { max: number; min: number; unit: "range" } } | { type: "stroke_type"; value: { unit: "swim_stroke"; value: number } } | { type: "open" }; targetType: "cadence" | "power" | "open" | "heart_rate" | "pace" | "stroke_type" }[] }