26 lines
653 B
TypeScript
26 lines
653 B
TypeScript
import * as TE from "fp-ts/lib/TaskEither";
|
|
import { pipe } from "fp-ts/lib/function";
|
|
import type { Schedule } from "../canary";
|
|
|
|
interface ScheduledJob {
|
|
id: string;
|
|
execute: TE.TaskEither<Error, boolean>;
|
|
at: Date;
|
|
schedule: Schedule;
|
|
}
|
|
|
|
type SchedulerState = ReadonlyArray<ScheduledJob>;
|
|
|
|
export const schedulerLoop =
|
|
(state: SchedulerState): TE.TaskEither<Error, void> =>
|
|
() => {
|
|
const loop = (currentState: SchedulerState): TE.TaskEither<Error, void> =>
|
|
pipe(
|
|
executeDueJobs(currentState),
|
|
delay(1000), // Delay for 1 second
|
|
map((newState) => loop(newState)),
|
|
);
|
|
|
|
return loop(state)();
|
|
};
|