using System;
namespace Science.Mathematics
{
///
/// A function is a relation that uniquely associates
/// members of one set with members of another set.
/// More formally, a function from A to B is an object f
/// such that every a in A is uniquely associated with
/// an object f(a) in B. A function is therefore
/// a many-to-one (or sometimes one-to-one) relation.
///
public class Function
{
public Function()
{
}
public delegate void ToVoid(T x);
public delegate void ToVoid(T x, U y);
public delegate void ToVoid(T x, U y, V z);
public delegate void ToVoid(T x, U y, V z, W t);
public delegate R ToLastType();
public delegate R ToLastType(T x);
public delegate R ToLastType(T x, U y);
public delegate R ToLastType(T x, U y, V z);
public delegate R ToLastType(T x, U y, V z, W t);
// Old functions are following.
public delegate int IntToInt(int x);
public delegate int[] IntToIntA(int x);
public delegate double IntToDouble(int x);
public delegate double[] IntToDoubleA(int x);
public delegate Complex IntToComplex(int x);
public delegate Complex[] IntToComplexA(int x);
public delegate int IntAToInt(int[] x);
public delegate int[] IntAToIntA(int[] x);
public delegate double IntAToDouble(int[] x);
public delegate double[] IntAToDoubleA(int[] x);
public delegate Complex IntAToComplex(int[] x);
public delegate Complex[] IntAToComplexA(int[] x);
public delegate int DoubleToInt(double x);
public delegate int[] DoubleToIntA(double x);
public delegate double DoubleToDouble(double x);
public delegate double[] DoubleToDoubleA(double x);
public delegate Complex DoubleToComplex(double x);
public delegate Complex[] DoubleToComplexA(double x);
public delegate int DoubleAToInt(double[] x);
public delegate int[] DoubleAToIntA(double[] x);
public delegate double DoubleAToDouble(double[] x);
public delegate double[] DoubleAToDoubleA(double[] x);
public delegate Complex DoubleAToComplex(double[] x);
public delegate Complex[] DoubleAToComplexA(double[] x);
public delegate int ComplexToInt(Complex x);
public delegate int[] ComplexToIntA(Complex x);
public delegate double ComplexToDouble(Complex x);
public delegate double[] ComplexToDoubleA(Complex x);
public delegate Complex ComplexToComplex(Complex x);
public delegate Complex[] ComplexToComplexA(Complex x);
public delegate int ComplexAToInt(Complex[] x);
public delegate int[] ComplexAToIntA(Complex[] x);
public delegate double ComplexAToDouble(Complex[] x);
public delegate double[] ComplexAToDoubleA(Complex[] x);
public delegate Complex ComplexAToComplex(Complex[] x);
public delegate Complex[] ComplexAToComplexA(Complex[] x);
public delegate double IntDoubleToDouble(int n, double x);
public delegate double[] IntDoubleToDoubleA(int n, double x);
public delegate double IntIntDoubleDoubleToDouble(int n, int m, double x, double y);
public delegate double DoubleDoubleToDouble(double x, double y);
public delegate double DoubleDoubleDoubleToDouble(double x, double y, double z);
public delegate double[] DoubleDoubleToDoubleA(double x, double y);
public delegate double[] DoubleDoubleADoubleAToDoubleA(double x, double[] y, double[] z);
public delegate double[] DoubleDoubleAToDoubleA(double x, double[] y);
public delegate double[] DoubleDoubleAIntToDoubleA(double x, double[] y, int n);
public delegate double[] DoubleDoubleAIntIntToDoubleA(double x, double[] y, int n, int m);
public delegate double[,] DoubleToDoubleM(double x);
public delegate double[,] DoubleAToDoubleM(double[] x);
public delegate double[,] DoubleDoubleAToDoubleM(double x, double[] y);
}
}