Skip to content

Commit cafb1ab

Browse files
committed
refactor(std): more methods
1 parent 2273998 commit cafb1ab

21 files changed

Lines changed: 368 additions & 144 deletions

File tree

packages/std/src/option/and.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import type { Option, Some } from './core'
2+
3+
import { isNone, isSome } from './is'
4+
5+
export const and = <T1, T2>(o: Option<T1>, fallback: Option<T2>): Option<T2> =>
6+
isNone(o)
7+
? o
8+
: fallback
9+
10+
export const andThen = <T1, T2>(o: Option<T1>, onSome: (s: Some<T1>) => Option<T2>): Option<T2> =>
11+
isSome(o)
12+
? onSome(o)
13+
: o
14+
15+
// eslint-disable-next-line sonarjs/no-identical-functions
16+
export const andThenAsync = async <T1, T2>(o: Option<T1>, onSome: (s: Some<T1>) => Promise<Option<T2>>): Promise<Option<T2>> =>
17+
isSome(o)
18+
? onSome(o)
19+
: o

packages/std/src/option/extract.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import type { Option } from './core'
2+
3+
import { isSome } from './is'
4+
5+
/** @experimental */
6+
export const extract = <T>(o: Option<T>): T | undefined =>
7+
isSome(o)
8+
? o.value
9+
: undefined

packages/std/src/option/index.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
1+
export * from './and'
2+
export * from './is'
13
export * from './core'
2-
export * from './methods'
4+
export * from './extract'
5+
export * from './map'
6+
export * from './match'
7+
export * from './ok'
8+
export * from './or'
9+
export * from './unwrap'

packages/std/src/option/is.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import type { None, Option, Some } from './core'
2+
3+
export const isNone = <T>(o: Option<T>): o is None =>
4+
o.__mo === 'none'
5+
6+
export const isNoneOr = <T>(o: Option<T>, onSomeValue: (v: T) => boolean): boolean =>
7+
isNone(o)
8+
? true
9+
: onSomeValue(o.value)
10+
11+
export const isNoneOrAsync = async <T>(o: Option<T>, onSomeValue: (v: T) => Promise<boolean>): Promise<boolean> =>
12+
isNone(o)
13+
? true
14+
: await onSomeValue(o.value)
15+
16+
export const isSome = <T>(o: Option<T>): o is Some<T> =>
17+
o.__mo === 'some'
18+
19+
export const isSomeAnd = <T>(o: Option<T>, onSomeValue: (v: T) => boolean): boolean =>
20+
isSome(o)
21+
? onSomeValue(o.value)
22+
: false
23+
24+
export const isSomeAndAsync = async <T>(o: Option<T>, onSomeValue: (v: T) => Promise<boolean>): Promise<boolean> =>
25+
isSome(o)
26+
? await onSomeValue(o.value)
27+
: false
28+

packages/std/src/option/map.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import type { Option } from './core'
2+
3+
import { some } from './core'
4+
import { isSome } from './is'
5+
6+
export const map = <T1, T2>(o: Option<T1>, onSomeValue: (v: T1) => T2): Option<T2> =>
7+
isSome(o)
8+
? some(onSomeValue(o.value))
9+
: o
10+
11+
export const mapAsync = async <T1, T2>(o: Option<T1>, onSomeValue: (v: T1) => Promise<T2>): Promise<Option<T2>> =>
12+
isSome(o)
13+
? some(await onSomeValue(o.value))
14+
: o
15+
16+
export const mapOr = <T1, T2>(o: Option<T1>, onSomeValue: (v: T1) => T2, fallback: T2): T2 =>
17+
isSome(o)
18+
? onSomeValue(o.value)
19+
: fallback
20+
21+
export const mapOrAsync = async <T1, T2>(o: Option<T1>, onSomeValue: (v: T1) => Promise<T2>, fallback: T2): Promise<T2> =>
22+
isSome(o)
23+
? await onSomeValue(o.value)
24+
: fallback
25+
26+
export const mapOrElse = <T1, T2>(o: Option<T1>, onSomeValue: (v: T1) => T2, onNone: () => T2): T2 =>
27+
isSome(o)
28+
? onSomeValue(o.value)
29+
: onNone()
30+
31+
export const mapOrElseAsync = async <T1, T2>(o: Option<T1>, onSomeValue: (v: T1) => Promise<T2>, onNone: () => Promise<T2>): Promise<T2> =>
32+
isSome(o)
33+
? await onSomeValue(o.value)
34+
: await onNone()

packages/std/src/option/match.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import type { Option, Some } from './core'
2+
3+
import { isSome } from './is'
4+
5+
export const match = <T1, T2>(o: Option<T1>, onSome: (s: Some<T1>) => T2, onNone: () => T2): T2 =>
6+
isSome(o)
7+
? onSome(o)
8+
: onNone()

packages/std/src/option/methods.ts

Lines changed: 0 additions & 53 deletions
This file was deleted.

packages/std/src/option/ok.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import type { Result } from '../result/core'
2+
import type { Option } from './core'
3+
4+
import { err, ok } from '../result/core'
5+
import { isSome } from './is'
6+
7+
export const okOr = <T, E>(o: Option<T>, error: E): Result<T, E> =>
8+
isSome(o)
9+
? ok(o.value)
10+
: err(error)
11+
12+
export const okOrElse = <T, E>(o: Option<T>, onNone: () => E): Result<T, E> =>
13+
isSome(o)
14+
? ok(o.value)
15+
: err(onNone())

packages/std/src/option/or.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import type { Option } from './core'
2+
3+
import { isSome } from './is'
4+
5+
export const or = <T>(o: Option<T>, fallback: Option<T>): Option<T> =>
6+
isSome(o)
7+
? o
8+
: fallback
9+
10+
export const orElse = <T>(o: Option<T>, onNone: () => Option<T>): Option<T> =>
11+
isSome(o)
12+
? o
13+
: onNone()
14+
15+
export const orElseAsync = async <T>(o: Option<T>, onNone: () => Promise<Option<T>>): Promise<Option<T>> =>
16+
isSome(o)
17+
? o
18+
: await onNone()

packages/std/src/option/unwrap.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import type { Option } from './core'
2+
3+
import { isSome } from './is'
4+
5+
export const unwrap = <T>(o: Option<T>): T => {
6+
if (isSome(o))
7+
return o.value
8+
else
9+
throw new Error('called `option.unwrap()` on a `None` value')
10+
}
11+
12+
export const unwrapOr = <T>(o: Option<T>, fallback: T): T =>
13+
isSome(o)
14+
? o.value
15+
: fallback
16+
17+
export const unwrapOrElse = <T>(o: Option<T>, onNone: () => T): T =>
18+
isSome(o)
19+
? o.value
20+
: onNone()
21+
22+
export const unwrapOrElseAsync = async <T>(o: Option<T>, onNone: () => Promise<T>): Promise<T> =>
23+
isSome(o)
24+
? o.value
25+
: await onNone()

0 commit comments

Comments
 (0)