27. Either函子
leezozz 1/27/2023 js
# Either函子
class Left {
static of (value) {
return new Left(value)
}
constructor(value) {
this._value = value
}
map() {
return this
}
}
class Right {
static of (value) {
return new Right(value)
}
constructor(value) {
this._value = value
}
map(fn) {
return new Right(fn(this._value))
}
}
let r1 = Left.of(12).map(item => item + 2)
let r2 = Right.of(12).map(item => item + 2)
console.log('r1', r1) // r1 Left { _value: 12 }
console.log('r1', r2) // r2 right { _value: 14 }
function parseJSON(str) {
try {
return Right.of(JSON.parse(str))
} catch(e) {
return Left.of({error: e.message})
}
}
let r3 = parseJSON('{name: zs}')
console.log('r3', r3) // r3 Left { _value: { error: 'Unexpected token n in JSON at position 1' } }
// let r4 = parseJSON('{"name": "zs"}')
let r4 = parseJSON('{"name": "zs"}')
.map(item => item.name.toUpperCase())
console.log('r4', r4) // r4 Right { _value: 'ZS' }
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
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