-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path05.either-examples.js
More file actions
106 lines (81 loc) · 2.3 KB
/
05.either-examples.js
File metadata and controls
106 lines (81 loc) · 2.3 KB
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/**
* Either examples in comparison with imperative code
*
*/
const fs = require('fs');
const { Left, Right, fromNullable } = require('./either');
// mocks
const currentUser = '';
const renderPage = () => 'success: page rendered';
const showLogin = () => 'error: session missing';
// Imperative style
function imperative_1 () {
const openSite = () => {
if (currentUser) {
return renderPage(currentUser);
} else {
return showLogin();
}
};
return openSite();
}
console.log('Imperative 1:', imperative_1());
// Functional style
function functional_1 () {
const openSite = () =>
fromNullable(currentUser)
.fold(showLogin, renderPage)
return openSite();
}
console.log('Functional 1:', functional_1());
// mocks
const user = { premium: false, preferences: { message: 'success: preferences loaded' } };
const defaultPreferences = { message: 'error: user not premium' };
const loadPreferences = p => p.message;
// Imperative style
function imperative_2 () {
const getPrefs = user => {
if (user.premium) {
return loadPreferences(user.preferences);
} else {
return loadPreferences(defaultPreferences);
}
};
return getPrefs(user);
}
console.log('Imperative 2:', imperative_2());
// Functional style
function functional_2 () {
const getPrefs = user =>
(user.premium ? Right(user) : Left(null))
.fold(() => loadPreferences(defaultPreferences), u => loadPreferences(u.preferences));
return getPrefs(user);
}
console.log('Functional 2:', functional_2());
// mocks
const student = { address_: { street: { name: 'success: my street name' } } };
const defaultStreet = { name: 'error: no street' };
// Imperative style
function imperative_3 () {
const streetName = student => {
const address = student.address;
if (address) {
const street = address.street;
if (street) {
return street.name;
}
}
return defaultStreet.name;
};
return streetName(student);
}
console.log('Imperative 3:', imperative_3());
// Functional style
function functional_3 () {
const streetName = student =>
fromNullable(student.address)
.chain(address => fromNullable(address.street))
.fold(() => defaultStreet.name, street => street.name)
return streetName(student);
}
console.log('Functional 3:', functional_3());