| 670 | |
| 671 | /** @internal */ |
| 672 | const FilterCauseReducer = <E>( |
| 673 | predicate: Predicate<Cause.Cause<E>> |
| 674 | ): Cause.CauseReducer<unknown, E, Cause.Cause<E>> => ({ |
| 675 | emptyCase: () => empty, |
| 676 | failCase: (_, error) => fail(error), |
| 677 | dieCase: (_, defect) => die(defect), |
| 678 | interruptCase: (_, fiberId) => interrupt(fiberId), |
| 679 | sequentialCase: (_, left, right) => { |
| 680 | if (predicate(left)) { |
| 681 | if (predicate(right)) { |
| 682 | return sequential(left, right) |
| 683 | } |
| 684 | return left |
| 685 | } |
| 686 | if (predicate(right)) { |
| 687 | return right |
| 688 | } |
| 689 | return empty |
| 690 | }, |
| 691 | parallelCase: (_, left, right) => { |
| 692 | if (predicate(left)) { |
| 693 | if (predicate(right)) { |
| 694 | return parallel(left, right) |
| 695 | } |
| 696 | return left |
| 697 | } |
| 698 | if (predicate(right)) { |
| 699 | return right |
| 700 | } |
| 701 | return empty |
| 702 | } |
| 703 | }) |
| 704 | |
| 705 | /** @internal */ |
| 706 | type CauseCase = SequentialCase | ParallelCase |