import ceylon.language.meta.declaration {
    FunctionalDeclaration,
    NestableDeclaration
}
import ceylon.language.meta.model {
    ClosedType = Type
}

"""A function model represents the model of a Ceylon function that you can inspect.
   
   A function model can be either a toplevel [[Function]], a 
   [[CallableConstructor|callable constructor]] of a toplevel Class,
   a member [[Method]] or [[CallableMemberConstructor|callable constructor]]
   of a member class.
 """
shared sealed interface FunctionModel<out Type=Anything, in Arguments=Nothing>
        satisfies Model & Generic & Functional
        given Arguments satisfies Anything[] {

    "This function's declaration."
    shared formal actual NestableDeclaration&FunctionalDeclaration declaration;

    "This function's return closed type."
    shared formal ClosedType<Type> type;
}