import type { LazyArg } from "effect-app/Function" import * as Effect from "effect/Effect" import * as Option from "effect/Option" import * as Result from "effect/Result" import type * as Scope from "effect/Scope" export type _R> = [T] extends [ Effect.Effect ] ? R : never export type _E> = [T] extends [ Effect.Effect ] ? E : never export function encaseMaybeInEffect_( o: Option.Option, onError: LazyArg ): Effect.Effect { return Option.match(o, { onNone: () => Effect.fail(onError()), onSome: Effect.succeed }) } export function encaseMaybeEither_( o: Option.Option, onError: LazyArg ): Result.Result { return Option.match(o, { onNone: () => Result.fail(onError()), onSome: Result.succeed }) } export function toNullable( self: Effect.Effect, E, R> ) { return Effect.map(self, (_) => Option.getOrNull(_)) } export function scope( scopedEffect: Effect.Effect, effect: Effect.Effect ): Effect.Effect> { return Effect.andThen(scopedEffect, effect).pipe(Effect.scoped) } export function flatMapScoped( scopedEffect: Effect.Effect, effect: (a: A) => Effect.Effect ): Effect.Effect> { return scopedEffect.pipe(Effect.flatMap(effect), Effect.scoped) }