> For the complete documentation index, see [llms.txt](https://gabriel-schade-cardoso.gitbook.io/tango/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://gabriel-schade-cardoso.gitbook.io/tango/modules/either/foldback.md).

# 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\<TRight, TState, TState> folderWhenRight</p><p>Func\<TLeft, TState, TState> folderWhenLeft</p><p>Either\<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
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gabriel-schade-cardoso.gitbook.io/tango/modules/either/foldback.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
