| 95 | const isStream = (u: unknown): u is Stream_.Stream<unknown, unknown> => hasProperty(u, Stream_.StreamTypeId) |
| 96 | |
| 97 | const parseStream = <A, E, RA, RE>( |
| 98 | decodeSuccess: ( |
| 99 | u: Chunk.Chunk<unknown>, |
| 100 | overrideOptions?: AST.ParseOptions |
| 101 | ) => Effect.Effect<Chunk.Chunk<A>, ParseResult.ParseIssue, RA>, |
| 102 | decodeFailure: (u: unknown, overrideOptions?: AST.ParseOptions) => Effect.Effect<E, ParseResult.ParseIssue, RE> |
| 103 | ) => |
| 104 | (u: unknown, options: AST.ParseOptions, ast: AST.AST) => |
| 105 | Effect.flatMap( |
| 106 | Effect.context<RA | RE>(), |
| 107 | (context) => { |
| 108 | if (!isStream(u)) return Effect.fail(new ParseResult.Type(ast, u)) |
| 109 | return Effect.succeed(u.pipe( |
| 110 | Stream_.mapChunksEffect((value) => decodeSuccess(value, options)), |
| 111 | Stream_.catchAll((error) => { |
| 112 | if (ParseResult.isParseError(error)) return Stream_.die(error) |
| 113 | return Effect.matchEffect(decodeFailure(error, options), { |
| 114 | onFailure: Effect.die, |
| 115 | onSuccess: Effect.fail |
| 116 | }) |
| 117 | }), |
| 118 | Stream_.provideContext(context) |
| 119 | )) |
| 120 | } |
| 121 | ) |