| 520 | |
| 521 | const reasonImpl = |
| 522 | <const Tag extends string, const ReasonTag extends string>(tag: Tag, reasonTag: ReasonTag) => |
| 523 | <Input>(input: Input): Result.Result<ExtractTag<Input, Tag>, ExcludeTag<Input, Tag>> => { |
| 524 | if ( |
| 525 | Predicate.isTagged(input, tag) && Predicate.hasProperty(input, "reason") && |
| 526 | Predicate.isTagged(input.reason, reasonTag) |
| 527 | ) { |
| 528 | return Result.succeed(input.reason as any) |
| 529 | } |
| 530 | return Result.fail(input as any) |
| 531 | } |
| 532 | |
| 533 | /** |
| 534 | * Creates a filter that only passes values equal to the specified value using structural equality. |