import type * as S from "effect/Schema"; import type { Primitive } from "./data.ts"; import type { Output } from "./output.ts"; export type Function = (...args: any[]) => any; export type Constructor = new (...args: any[]) => any; export type PolicyLike = { kind: "alchemy/Policy" }; export type Input = | T | (T extends S.Schema ? never : | Output | (T extends Primitive ? never : T extends any[] ? number extends T["length"] ? Input[] : Inputs : T extends object ? { [K in keyof T]: Input } : never)); export type InputProps< T extends Record, Static extends keyof T = never, > = { [K in keyof T]: K extends Static ? T[K] : Input; }; export declare namespace Input { export type Resolve = T extends Output ? U : T extends | Primitive | Constructor | Function | S.Schema | PolicyLike ? T : T extends any[] ? ResolveArray : T extends Record ? { [k in keyof T]: Input.Resolve; } : never; export type ResolveArray = number extends T["length"] ? Resolve[] : ResolveTuple; export type ResolveTuple< T extends any[], // TODO(sam): I added the accumulator because it resolved infinite type instantiation Accum extends any[] = [], > = T extends [infer H, ...infer Tail] ? ResolveTuple]> : Accum; export type ResolveProps> = { [k in keyof Props]: Input.Resolve; }; export type ResolveOpaque = // use true extends IsOut to avoid distribution in the case where we have an Out // because T is a clean type, e.g. Input should just be SubnetProps (don't bother resolving the recursive input type variants) true extends IsOut ? ResolveOut : Resolve; export type IsOut = T extends Output ? true : never; export type ResolveOut = T extends Output ? U : never; } export type Inputs = T extends [ infer H, ...infer T, ] ? Inputs]> : Out;