-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathmaybe.ts
48 lines (44 loc) · 1.32 KB
/
maybe.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import { Result, Ok, Err } from './result'
export type Maybe<A> = {
ap: <B>(m: Maybe<any>) => Maybe<B>
map: <B>(cb: (arg: A) => B) => Maybe<B>
chain: <B>(cb: (arg: A) => Maybe<B>) => Maybe<B>
alt: <B>(value: B) => Maybe<A | B>
cata: <B, C>(obj: {
Just: (arg: A) => B
Nothing: () => C
}) => B|C
toResult: () => Result<any, any>
inspect: () => string
isNothing: () => boolean
isJust: () => boolean,
value: () => A | undefined
}
export const Just = <A>(arg: A): Maybe<A> => ({
ap: <B>(m: Maybe<B>): Maybe<B> => typeof arg === 'function' ? m.map(v => arg(v)) : Nothing,
map: <B>(cb: (a: A) => B): Maybe<B> => Just(cb(arg)),
chain: <B>(cb: (a: A) => Maybe<B>): Maybe<B> => cb(arg),
alt: () => Just(arg),
cata: obj => obj.Just(arg),
toResult: () => Ok(arg),
inspect: () => `Just(${arg})`,
isNothing: () => false,
isJust: () => true,
value: () => arg
})
export const Nothing: Maybe<any> = ({
ap: (): Maybe<any> => Nothing,
map: (): Maybe<any> => Nothing,
chain: (): Maybe<any> => Nothing,
alt: a => Just(a),
cata: obj => obj.Nothing(),
toResult: () => Err(),
inspect: () => `Nothing`,
isNothing: () => true,
isJust: () => false,
value: () => undefined
})
export const nullable = <T>(arg?: T): Maybe<NonNullable<T>> =>
arg === null || arg === undefined
? Nothing
: Just(arg)