veffect
Version:
powerful TypeScript validation library built on the robust foundation of Effect combining exceptional type safety, high performance, and developer experience. Taking inspiration from Effect's functional principles, VEffect delivers a balanced approach tha
47 lines (45 loc) • 1.82 kB
text/typescript
import * as Cause from "../../Cause.js"
import * as Chunk from "../../Chunk.js"
import * as Effect from "../../Effect.js"
import * as Exit from "../../Exit.js"
import { pipe } from "../../Function.js"
import * as Option from "../../Option.js"
import type * as Emit from "../../StreamEmit.js"
/** @internal */
export const make = <R, E, A, B>(
emit: (f: Effect.Effect<Chunk.Chunk<A>, Option.Option<E>, R>) => Promise<B>
): Emit.Emit<R, E, A, B> => {
const ops: Emit.EmitOps<R, E, A, B> = {
chunk(this: Emit.Emit<R, E, A, B>, as: Chunk.Chunk<A>) {
return this(Effect.succeed(as))
},
die<Err>(this: Emit.Emit<R, E, A, B>, defect: Err) {
return this(Effect.die(defect))
},
dieMessage(this: Emit.Emit<R, E, A, B>, message: string) {
return this(Effect.dieMessage(message))
},
done(this: Emit.Emit<R, E, A, B>, exit: Exit.Exit<A, E>) {
return this(Effect.suspend(() => Exit.mapBoth(exit, { onFailure: Option.some, onSuccess: Chunk.of })))
},
end(this: Emit.Emit<R, E, A, B>) {
return this(Effect.fail(Option.none()))
},
fail(this: Emit.Emit<R, E, A, B>, e: E) {
return this(Effect.fail(Option.some(e)))
},
fromEffect(this: Emit.Emit<R, E, A, B>, effect: Effect.Effect<A, E, R>) {
return this(Effect.mapBoth(effect, { onFailure: Option.some, onSuccess: Chunk.of }))
},
fromEffectChunk(this: Emit.Emit<R, E, A, B>, effect: Effect.Effect<Chunk.Chunk<A>, E, R>) {
return this(pipe(effect, Effect.mapError(Option.some)))
},
halt(this: Emit.Emit<R, E, A, B>, cause: Cause.Cause<E>) {
return this(Effect.failCause(pipe(cause, Cause.map(Option.some))))
},
single(this: Emit.Emit<R, E, A, B>, value: A) {
return this(Effect.succeed(Chunk.of(value)))
}
}
return Object.assign(emit, ops)
}