1import type { EnvironmentId as EnvironmentIdType } from "@t3tools/contracts";
2import * as Effect from "effect/Effect";
3import * as Stream from "effect/Stream";
4import * as EnvironmentRegistry from "../connection/registry.ts";
5import type * as EnvironmentSupervisor from "../connection/supervisor.ts";
6
7export function runStreamInEnvironment<A, E, R>(
8 environmentId: EnvironmentIdType,
9 stream: Stream.Stream<A, E, R>,
10): Stream.Stream<
11 A,
12 E | EnvironmentRegistry.EnvironmentNotRegisteredError,
13 EnvironmentRegistry.EnvironmentRegistry | Exclude<R, EnvironmentSupervisor.EnvironmentSupervisor>
14> {
15 return Stream.unwrap(
16 EnvironmentRegistry.EnvironmentRegistry.pipe(
17 Effect.map((registry) => registry.runStream(environmentId, stream)),
18 ),
19 );
20}
21
22export function followStreamInEnvironment<A, E, R>(
23 environmentId: EnvironmentIdType,
24 stream: Stream.Stream<A, E, R>,
25): Stream.Stream<
26 A,
27 E,
28 EnvironmentRegistry.EnvironmentRegistry | Exclude<R, EnvironmentSupervisor.EnvironmentSupervisor>
29> {
30 return Stream.unwrap(
31 EnvironmentRegistry.EnvironmentRegistry.pipe(
32 Effect.map((registry) => registry.followStream(environmentId, stream)),
33 ),
34 );
35}