## Task
A `Task` makes it easy to model asynchronous operations that may fail, such as HTTP requests or reading/writing to files/databases.
**Implements:** [Monad](https://github.com/fantasyland/fantasy-land#monad), [Semigroup](https://github.com/fantasyland/fantasy-land#semigroup)
- [Task](#task)
- [Task(f)](#taskf)
- [Task.of(v)](#taskofv)
- [Task.rejected(v)](#taskrejectedv)
- [Task.fork(reject, resolve)](#taskforkreject-resolve)
- [Task.toString()](#tasktostring)
- [Task.map(f)](#taskmapf)
- [Task.getValue()](#taskgetvalue)
- [Task.ap(t)](#taskapt)
- [Task.concat(t)](#taskconcatt)
- [Task.chain(f)](#taskchainf)
- [Task.toPromise()](#tasktopromise)
### Task(f)
`Task` constructor.
| Param | Type | Description |
| ----- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| f | function | A function that takes two arguments: `reject` and `resolve`, which are functions. The function `f` normally initiates an asynchronous task or one that has side effects, and once it completes, it either calls the `resolve` function to resolve the task or rejects it. |
### Task.of(v)
`Task` constructor that creates a `Task` which immediately resolves.
| Param | Type | Description |
| ----- | ---------------- | -------------------------------------------------- |
| v | any | The value that is passed to the `resolve` function |
### Task.rejected(v)
`Task` constructor that creates a `Task` which immediately gets rejected.
| Param | Type | Description |
| ----- | ---------------- | --------------------------------------------------- |
| v | any | The value that is passed to the `rejected` function |
### Task.fork(reject, resolve)
Executes the `Task`.
| Param | Type | Description |
| ------- | --------------------- | ------------------------------------------------- |
| reject | function | Function to be called when the `Task` is rejected |
| resolve | function | Function to be called when the `Task` is resolved |
### Task.toString()
Gets a stringified version of the `Task`.
### Task.map(f)
Applies the function `f` to the value of a successfully resolved `Task`.
| Param | Type | Description |
| ----- | --------------------- | ----------- |
| f | function | Function |
### Task.getValue()
Gets the function within the `Task`.
### Task.ap(t)
Applies the successful value of the `Task` `t` to the successful value (a function) of the current `Task`.
| Param | Type | Description |
| ----- | -------------------------- | -------------------------------------------- |
| t | [Task](#Task) | `Task` with a function as the second element |
### Task.concat(t)
Concatenates the current `Task` with the passed one and returns a new `Task`. When resolved, it will return the successful result of both tasks.
| Param | Type | Description |
| ----- | -------------------------- | --------------------- |
| t | [Task](#Task) | `Task` to concatenate |
### Task.chain(f)
Chains together many computations that return a `Task`.
| Param | Type | Description |
| ----- | --------------------- | ------------------------------------ |
| f | function | Function that returns another `Task` |
### Task.toPromise()
Converts the current `Task` to a `Promise`.