| 1 | import type * as Arr from "../Array.ts" |
| 2 | import type * as Channel from "../Channel.ts" |
| 3 | import { identity } from "../Function.ts" |
| 4 | import { pipeArguments } from "../Pipeable.ts" |
| 5 | import type { Stream } from "../Stream.ts" |
| 6 | |
| 7 | const TypeId = "~effect/Stream" |
| 8 | |
| 9 | const streamVariance = { |
| 10 | _R: identity, |
| 11 | _E: identity, |
| 12 | _A: identity |
| 13 | } |
| 14 | |
| 15 | const Stream: { |
| 16 | new<A extends Arr.NonEmptyReadonlyArray<any>, E, R>( |
| 17 | channel: Channel.Channel<A, E, void, unknown, unknown, unknown, R> |
| 18 | ): Stream<A extends Arr.NonEmptyReadonlyArray<infer A> ? A : never, E, R> |
| 19 | } = function<A extends Arr.NonEmptyReadonlyArray<any>, E, R>( |
| 20 | this: any, |
| 21 | channel: Channel.Channel<A, E, void, unknown, unknown, unknown, R> |
| 22 | ) { |
| 23 | this.channel = channel |
| 24 | } as any |
| 25 | |
| 26 | Stream.prototype = { |
| 27 | [TypeId]: streamVariance, |
| 28 | pipe() { |
| 29 | return pipeArguments(this, arguments) |
| 30 | } |
| 31 | } |
| 32 | |
| 33 | /** @internal */ |
| 34 | export const fromChannel = <A extends Arr.NonEmptyReadonlyArray<any>, E, R>( |
| 35 | channel: Channel.Channel<A, E, void, unknown, unknown, unknown, R> |
| 36 | ): Stream<A extends Arr.NonEmptyReadonlyArray<infer A> ? A : never, E, R> => new Stream(channel) |