# Currying

> [`Tango.Functional.Currying`](https://github.com/gabrielschade/Tango/blob/master/Tango/Tango/Functional/Currying.cs)

This _static_ class contains several overloads for the Currying operation, where each overload deals with functions that contains different amounts of parameters, with or without a return.

## Methods

| Name  | Parameters                             | Returns                                           | Description                               |
| ----- | -------------------------------------- | ------------------------------------------------- | ----------------------------------------- |
| Curry | Func\<T, T2, TResult> function         | Func\<T, Func\<T2, TResult>>                      | Creates a new curried method of function. |
| Curry | Func\<T, T2, T3, TResult> function     | Func\<T, Func\<T2, Func\<T3,TResult>>>            | Creates a new curried method of function. |
| Curry | Func\<T, T2, T3, T4, TResult> function | Func\<T, Func\<T2, Func\<T3,Func\<T4, TResult>>>> | Creates a new curried method of function. |
| Curry | Action\<T, T2> action                  | Func\<T, Action\<T2>>                             | Creates a new curried method of function. |
| Curry | Action\<T, T2, T3> action              | Func\<T, Func\<T2, Action\<T3>>>                  | Creates a new curried method of function. |
| Curry | Action\<T, T2, T3, T4> action          | Func\<T, Func\<T2, Func\<T3,Action\<T4>>>>        | Creates a new curried method of function. |

## Usage

The overloads available in this class can be used to create new functions from existing functions.

In this example we'll consider an `add` function as a function that performs a sum of two numbers:

```csharp
 Func<int, int, int> add = (value, value2) => value + value2;
```

With the application of the `Curry` function is created a new function as return, this function needs only one of the parameters of the sum as argument and returns a new function. This last function needs the last parameter of the sum and return the result of this operation.

```csharp
Func<int, int, int> add = 
    (value, value2) => value + value2;

Func<int, Func<int, int>> addCurried = Currying.Curry(add);
curriedResult = addCurried(2)(3);
```

The fundamentals about Currying and another examples can be find in [Fundamentals> Currying and Partial Application](https://github.com/gabrielschade/tango/tree/379cc4a38ae47796971eb875ec66e7dc053a9081/Concepts/Currying%20and%20Partial%20Application.html).
