This will help recover from downtime within processes that are supposed to have 100% uptime.
public fun Clock.schedulePulse(
schedule: PulseSchedule,
timeZone: TimeZone = TimeZone.UTC,
lastExecution: Instant = now()
): Pulse {
val flow = flow {
var lastPulse: LocalDateTime = lastExecution.toLocalDateTime(timeZone)
while (true) {
val nextPulse = lastPulse.nextMatch(schedule)
delayUntil(nextPulse, timeZone)
emit(nextPulse.toInstant(timeZone))
lastPulse = nextPulse
}
}
return Pulse(flow)
}