import type { BoundInjectionToken, ClassType, FactoryInjectionToken, InjectionToken, } from '../token/injection-token.mjs' // Utility types for string manipulation and union handling export type Join = TElements extends Readonly<[infer First, ...infer Rest]> ? Rest extends ReadonlyArray ? First extends string ? `${First}${Rest extends [] ? '' : TSeparator}${Join}` : never : never : '' // credits goes to https://stackoverflow.com/a/50375286 export type UnionToIntersection = ( U extends any ? (k: U) => void : never ) extends (k: infer I) => void ? I : never // Converts union to overloaded function export type UnionToOvlds = UnionToIntersection< U extends any ? (f: U) => void : never > export type PopUnion = UnionToOvlds extends (a: infer A) => void ? A : never export type IsUnion = [T] extends [UnionToIntersection] ? false : true export type UnionToArray = IsUnion extends true ? UnionToArray>, [PopUnion, ...A]> : [T, ...A] export type InjectRequest = { token: | InjectionToken | BoundInjectionToken | FactoryInjectionToken | ClassType promise: Promise readonly result: any readonly error: Error | null } // InjectState interface for managing injection state export interface InjectState { currentIndex: number isFrozen: boolean requests: InjectRequest[] }