| 616 | * @since 4.0.0 |
| 617 | */ |
| 618 | export const max = < |
| 619 | const Schedules extends NonEmptyReadonlyArray< |
| 620 | Schedule<any, any, any, any> |
| 621 | > |
| 622 | >( |
| 623 | schedules: Schedules |
| 624 | ): Schedule< |
| 625 | Duration.Duration, |
| 626 | UnionToIntersection< |
| 627 | Input<Schedules[number]> |
| 628 | >, |
| 629 | Error<Schedules[number]>, |
| 630 | Env<Schedules[number]> |
| 631 | > => |
| 632 | fromStep(effect.map( |
| 633 | effect.all(schedules.map(toStep)), |
| 634 | (steps) => (now, input) => |
| 635 | effect.flatMap( |
| 636 | effect.forEach(steps, (step) => |
| 637 | Pull.matchEffect(step(now, input as never), { |
| 638 | onSuccess: (result) => effect.succeed(result[1]), |
| 639 | onDone: () => effect.undefined, |
| 640 | onFailure: effect.failCause |
| 641 | })), |
| 642 | (results) => { |
| 643 | const duration = maxDuration(results) |
| 644 | if (duration === undefined) { |
| 645 | return Cause.done(Duration.zero) |
| 646 | } |
| 647 | return effect.succeed([duration, duration] as [Duration.Duration, Duration.Duration]) |
| 648 | } |
| 649 | ) |
| 650 | )) |
| 651 | |
| 652 | const maxDuration = (results: ReadonlyArray<Duration.Duration | undefined>): Duration.Duration | undefined => { |
| 653 | let max = results[0] |