/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ import * as Effect from "effect/Effect" interface Callback { (err: E, a?: A): void } type ArgsWithCallback, E, A> = [...args: Args, cb: Callback] type WithoutNull = unknown extends A ? void : Exclude type Effectify = T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 (...args: ArgsWithCallback): infer _R4 (...args: ArgsWithCallback): infer _R5 (...args: ArgsWithCallback): infer _R6 (...args: ArgsWithCallback): infer _R7 (...args: ArgsWithCallback): infer _R8 (...args: ArgsWithCallback): infer _R9 (...args: ArgsWithCallback): infer _R10 } ? { (...args: Args1): Effect.Effect, E> (...args: Args2): Effect.Effect, E> (...args: Args3): Effect.Effect, E> (...args: Args4): Effect.Effect, E> (...args: Args5): Effect.Effect, E> (...args: Args6): Effect.Effect, E> (...args: Args7): Effect.Effect, E> (...args: Args8): Effect.Effect, E> (...args: Args9): Effect.Effect, E> (...args: Args10): Effect.Effect, E> } : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 (...args: ArgsWithCallback): infer _R4 (...args: ArgsWithCallback): infer _R5 (...args: ArgsWithCallback): infer _R6 (...args: ArgsWithCallback): infer _R7 (...args: ArgsWithCallback): infer _R8 (...args: ArgsWithCallback): infer _R9 } ? { (...args: Args1): Effect.Effect, E> (...args: Args2): Effect.Effect, E> (...args: Args3): Effect.Effect, E> (...args: Args4): Effect.Effect, E> (...args: Args5): Effect.Effect, E> (...args: Args6): Effect.Effect, E> (...args: Args7): Effect.Effect, E> (...args: Args8): Effect.Effect, E> (...args: Args9): Effect.Effect, E> } : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 (...args: ArgsWithCallback): infer _R4 (...args: ArgsWithCallback): infer _R5 (...args: ArgsWithCallback): infer _R6 (...args: ArgsWithCallback): infer _R7 (...args: ArgsWithCallback): infer _R8 } ? { (...args: Args1): Effect.Effect, E> (...args: Args2): Effect.Effect, E> (...args: Args3): Effect.Effect, E> (...args: Args4): Effect.Effect, E> (...args: Args5): Effect.Effect, E> (...args: Args6): Effect.Effect, E> (...args: Args7): Effect.Effect, E> (...args: Args8): Effect.Effect, E> } : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 (...args: ArgsWithCallback): infer _R4 (...args: ArgsWithCallback): infer _R5 (...args: ArgsWithCallback): infer _R6 (...args: ArgsWithCallback): infer _R7 } ? { (...args: Args1): Effect.Effect, E> (...args: Args2): Effect.Effect, E> (...args: Args3): Effect.Effect, E> (...args: Args4): Effect.Effect, E> (...args: Args5): Effect.Effect, E> (...args: Args6): Effect.Effect, E> (...args: Args7): Effect.Effect, E> } : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 (...args: ArgsWithCallback): infer _R4 (...args: ArgsWithCallback): infer _R5 (...args: ArgsWithCallback): infer _R6 } ? { (...args: Args1): Effect.Effect, E> (...args: Args2): Effect.Effect, E> (...args: Args3): Effect.Effect, E> (...args: Args4): Effect.Effect, E> (...args: Args5): Effect.Effect, E> (...args: Args6): Effect.Effect, E> } : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 (...args: ArgsWithCallback): infer _R4 (...args: ArgsWithCallback): infer _R5 } ? { (...args: Args1): Effect.Effect, E> (...args: Args2): Effect.Effect, E> (...args: Args3): Effect.Effect, E> (...args: Args4): Effect.Effect, E> (...args: Args5): Effect.Effect, E> } : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 (...args: ArgsWithCallback): infer _R4 } ? { (...args: Args1): Effect.Effect, E> (...args: Args2): Effect.Effect, E> (...args: Args3): Effect.Effect, E> (...args: Args4): Effect.Effect, E> } : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 } ? { (...args: Args1): Effect.Effect, E> (...args: Args2): Effect.Effect, E> (...args: Args3): Effect.Effect, E> } : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 } ? { (...args: Args1): Effect.Effect, E> (...args: Args2): Effect.Effect, E> } : T extends { (...args: ArgsWithCallback): infer _R1 } ? { (...args: Args1): Effect.Effect, E> } : never type CallbackError = T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 (...args: ArgsWithCallback): infer _R4 (...args: ArgsWithCallback): infer _R5 (...args: ArgsWithCallback): infer _R6 (...args: ArgsWithCallback): infer _R7 (...args: ArgsWithCallback): infer _R8 (...args: ArgsWithCallback): infer _R9 (...args: ArgsWithCallback): infer _R10 } ? NonNullable : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 (...args: ArgsWithCallback): infer _R4 (...args: ArgsWithCallback): infer _R5 (...args: ArgsWithCallback): infer _R6 (...args: ArgsWithCallback): infer _R7 (...args: ArgsWithCallback): infer _R8 (...args: ArgsWithCallback): infer _R9 } ? NonNullable : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 (...args: ArgsWithCallback): infer _R4 (...args: ArgsWithCallback): infer _R5 (...args: ArgsWithCallback): infer _R6 (...args: ArgsWithCallback): infer _R7 (...args: ArgsWithCallback): infer _R8 } ? NonNullable : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 (...args: ArgsWithCallback): infer _R4 (...args: ArgsWithCallback): infer _R5 (...args: ArgsWithCallback): infer _R6 (...args: ArgsWithCallback): infer _R7 } ? NonNullable : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 (...args: ArgsWithCallback): infer _R4 (...args: ArgsWithCallback): infer _R5 (...args: ArgsWithCallback): infer _R6 } ? NonNullable : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 (...args: ArgsWithCallback): infer _R4 (...args: ArgsWithCallback): infer _R5 } ? NonNullable : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 (...args: ArgsWithCallback): infer _R4 } ? NonNullable : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 (...args: ArgsWithCallback): infer _R3 } ? NonNullable : T extends { (...args: ArgsWithCallback): infer _R1 (...args: ArgsWithCallback): infer _R2 } ? NonNullable : T extends { (...args: ArgsWithCallback): infer _R1 } ? NonNullable : never export const effectify: { ) => any>(fn: F): Effectify> ) => any, E>( fn: F, onError: (error: CallbackError, args: Parameters) => E ): Effectify ) => any, E, E2>( fn: F, onError: (error: CallbackError, args: Parameters) => E, onSyncError: (error: unknown, args: Parameters) => E2 ): Effectify } = // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type ((fn: Function, onError?: (e: any, args: any) => any, onSyncError?: (e: any, args: any) => any) => (...args: Array) => Effect.callback((resume) => { try { fn(...args, (err: Error | null, result: A) => { if (err) { resume(Effect.fail(onError ? onError(err, args) : err)) } else { resume(Effect.succeed(result)) } }) } catch (err) { resume(onSyncError ? Effect.fail(onSyncError(err, args)) : Effect.die(err)) } })) as any