export type ShapeFn = Pick< T, { [k in keyof T]: T[k] extends ( ...args: infer ARGS ) => Effect ? ((...args: ARGS) => Effect) extends T[k] ? k : never : never }[keyof T] > export type ShapeCn = Pick< T, { [k in keyof T]: T[k] extends Effect ? k : never }[keyof T] > export type DerivedLifted< T, Fns extends keyof ShapeFn, Cns extends keyof ShapeCn, Values extends keyof T > = & { [k in Fns]: T[k] extends (...args: infer ARGS) => Effect ? (...args: ARGS) => Effect : never } & { [k in Cns]: T[k] extends Effect ? Effect : never } & { [k in Values]: Effect } /** * @tsplus static effect/core/io/Effect.Ops deriveLifted */ export function deriveLifted( S: Tag ): < Fns extends keyof ShapeFn = never, Cns extends keyof ShapeCn = never, Values extends keyof T = never >( functions: Fns[], effects: Cns[], values: Values[] ) => DerivedLifted { return (functions, constants, values) => { const ret = {} as any for (const k of functions) { ret[k] = (...args: any[]) => Effect.serviceWithEffect(S, (h) => (h[k] as any)(...args)) } for (const k of constants) { ret[k] = Effect.serviceWithEffect(S, (h) => h[k] as any) } for (const k of values) { ret[k] = Effect.serviceWith(S, (h) => h[k]) } return ret as any } } export type DerivedAccessM = { [k in Gens]: (f: (_: T[k]) => Effect) => Effect } /** * @tsplus static effect/core/io/Effect.Ops deriveAccessEffect */ export function deriveAccessEffect( S: Tag ): (generics: Gens[]) => DerivedAccessM { return (generics) => { const ret = {} as any for (const k of generics) { ret[k] = (f: any, trace?: string) => Effect.serviceWithEffect(S, (h) => f(h[k])) } return ret as any } } export type DerivedAccess = { [k in Gens]: (f: (_: T[k]) => A_) => Effect } /** * @tsplus static effect/core/io/Effect.Ops deriveAccess */ export function deriveAccess( S: Tag ): (generics: Gens[]) => DerivedAccess { return (generics) => { const ret = {} as any for (const k of generics) { ret[k] = (f: any, trace?: string) => Effect.serviceWith(S, (h) => f(h[k])) } return ret as any } }