1import type * as Arr from "../Array.ts"
2import type * as Channel from "../Channel.ts"
3import { identity } from "../Function.ts"
4import { pipeArguments } from "../Pipeable.ts"
5import type { Stream } from "../Stream.ts"
6
7const TypeId = "~effect/Stream"
8
9const streamVariance = {
10 _R: identity,
11 _E: identity,
12 _A: identity
13}
14
15const 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
26Stream.prototype = {
27 [TypeId]: streamVariance,
28 pipe() {
29 return pipeArguments(this, arguments)
30 }
31}
32
33/** @internal */
34export 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)