Skip to content

Commit

Permalink
feat: adds transpose
Browse files Browse the repository at this point in the history
  • Loading branch information
OctoD committed Jul 16, 2019
1 parent 8bc3a65 commit f94bddf
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 0 deletions.
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ Heavily inspired by rust [std::option](https://doc.rust-lang.org/std/option/inde
- [okOrElse](#okOrElse)
- [or](#or)
- [orElse](#orElse)
- [transpose](#transpose)
- [xor](#xor)
- [unwrap](#unwrap)
- [unwrapOr](#unwrapOr)
Expand Down Expand Up @@ -202,6 +203,14 @@ Some(10).orElse(() => 1000) // Some(10)
None().orElse(() => 1000) // Some(1000)
```

#### transpose

Transposes an `Option` of a `Result` into a `Result` of an `Option`.

```ts
Option(100).transpose() // Ok(Some(100))
```

#### xor

Returns Some if exactly one of self, optb is Some, otherwise returns None.
Expand Down
14 changes: 14 additions & 0 deletions src/Option.ts
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,20 @@ class OptionLike<T> {
return this.isSome() ? this : f();
}

/**
* Transposes an `Option` of a `Result` into a `Result` of an `Option`.
*
* ```ts
* Option(100).transpose() // Ok(Some(100))
* ```
*
* @returns {(Ok<Some<T>> | Ok<None>)}
* @memberof OptionLike
*/
public transpose(): Ok<Some<T>> | Ok<None> {
return this.isSome() ? Ok(Some(this.value)) : Ok(None());
}

/**
* Returns Some if exactly one of self,
* optb is Some,
Expand Down
5 changes: 5 additions & 0 deletions src/__tests__/Option.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,4 +113,9 @@ describe(`Option`, () => {
expect(Some(100).okOrElse(() => Err("foo"))).toStrictEqual(Ok(100));
expect(None().okOrElse(() => Err("foo"))).toStrictEqual(Err("foo"));
});

it("Transposes an `Option` of a `Result` into a `Result` of an `Option`.", () => {
expect(Some(100).transpose()).toStrictEqual(Ok(Some(100)));
expect(None().transpose()).toStrictEqual(Ok(None()));
});
});

0 comments on commit f94bddf

Please sign in to comment.