# FoldBack

Creates a new `TState` value by applying the given `folder` functions to `state` and `Either<TLeft, TRight>` value according to its state.

| Parameters                                                                                                                                                                | Returns |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
| <p>Func&#x3C;TRight, TState, TState> folderWhenRight</p><p>Func&#x3C;TLeft, TState, TState> folderWhenLeft</p><p>Either&#x3C;TLeft, TRight> either</p><p>TState state</p> | TState  |

## Usage

This function applies the `folder` function to the `Either<TLeft, TRight>` value and to the `state` according its state.

This function is similar to `Fold`, the only difference between these two functions are the parameters order and the parameters order of the `folder` functions.

&#x20;**When Either IsRight**&#x20;

```csharp
int state = 20
Either<string, int> eitherValue = 22;
int result = 
    eitherValue.FoldBack(
        (right, _state) => right + _state,
        (left, _state) => _state + 10,
        state);

//result = 42
```

&#x20;**When Either IsLeft**&#x20;

```csharp
int state = 20
Either<string, int> eitherValue = 22;
int result = 
    eitherValue.FoldBack(
        (right, _state) => right + _state,
        (left, _state) => _state + 10,
        state);

//result = 30
```

&#x20;**One sided approach**

You can also use the `FoldLeft` and `FoldRight` to produce the same results, but with these methods the folder is applied just to one of the possible values.

When the target type is different from `Either` current value the result always will be equals to `state`.

&#x20;**FoldBackRight when Either IsRight**&#x20;

```csharp
int state = 20
Either<string, int> eitherValue = 22;
int result = 
    eitherValue.FoldBackRight(
        (right, _state) => right + _state,
        state);

//result = 42
```

&#x20;**FoldBackRight when Either IsLeft**&#x20;

```csharp
int state = 20
Either<string, int> eitherValue = "ERROR";
int result = eitherValue.FoldBackRight(
(right, _state) => right + _state,
state);
//result = 20
```

&#x20;**FoldBackLeft when Either IsRight**&#x20;

```csharp
int state = 20
Either<string, int> eitherValue = 22;
int result = eitherValue.FoldBackLeft(
(left, _state) => _state + 10,
state);
//result = 20
```
