import { FromDefinition, ModelDefinition } from "../types/definitions"; import { Model } from "./object-model"; type FromArgsDef = T extends [infer A, ...infer Rest] ? [FromDefinition, ...FromArgsDef] : T export type FunctionSignature = { (...args: FromArgsDef): FromDefinition } export interface FunctionModel extends Model<{ arguments: Args, return: Return }> { (): FunctionSignature; (fn: FunctionSignature): FunctionSignature; new (fn: FunctionSignature): FunctionSignature; definition: { arguments: Args, return: Return }; return(returnValueDefinition: R): FunctionModel; } export interface FunctionModelConstructor { (...argumentsDefinitions: Args): FunctionModel; new(...argumentsDefinitions: Args): FunctionModel; } export const FunctionModel: FunctionModelConstructor;