Import
import { make } from "@typed/fx/Push";Signatures
export declare const make: {
<B, E2, R2>(fx: Fx.Fx<B, E2, R2>): <A, E, R>(sink: Sink.Sink<A, E, R>) => Push<A, E, R, B, E2, R2>;
<A, E, R, B, E2, R2>(sink: Sink.Sink<A, E, R>, fx: Fx.Fx<B, E2, R2>): Push<A, E, R, B, E2, R2>;
};Why
make is the explicit boundary where a command consumer and event producer
become one bidirectional capability without hiding either contract.
Ownership and lifetime
Construction is allocation-free apart from the wrapper. Each input callback is owned by its caller; each output run is owned by the wrapped Fx run and inherits its interruption, Scope, cleanup, failures, and services.
Examples
import { Effect } from "effect"
import * as Push from "@typed/fx/Push"
import { Fx } from "@typed/fx"
import * as Sink from "@typed/fx/Sink"
const received: Array<number> = []
const sink = Sink.make(() => Effect.void, (value: number) =>
Effect.sync(() => received.push(value))
)
const push = Push.make(sink, Fx.fromIterable(["ready", "done"]))
const program = Effect.gen(function* () {
yield* push.onSuccess(42) // acknowledges the Sink callback
const output = yield* Fx.collectAll(push)
return { received, output }
}).pipe(Effect.scoped)Other public imports
These import paths expose the same declaration. Each page retains its own public name and signature.