-
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathResult.ts
More file actions
208 lines (186 loc) · 8.75 KB
/
Result.ts
File metadata and controls
208 lines (186 loc) · 8.75 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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
import * as Equal from "@effect/data/Equal"
import * as O from "@effect/data/Option"
import * as S from "@effect/data/String"
import * as Cause from "@effect/io/Cause"
import * as Exit from "@effect/io/Exit"
import * as Result from "effect-react/Result"
import { result } from "effect-react/test/utils/result"
import * as fc from "fast-check"
import { inspect } from "util"
import { assert, describe, it } from "vitest"
describe("Result", () => {
it("should export", () => {
assert.exists(Result.TypeId)
})
it("should be compared for equality by value", () => {
assert.isTrue(Equal.equals(Result.fail(1), Result.fail(1)))
assert.isFalse(Equal.equals(Result.fail(1), Result.fail(2)))
assert.isTrue(Equal.equals(Result.success(1), Result.success(1)))
assert.isFalse(Equal.equals(Result.success(1), Result.success(2)))
assert.isTrue(Equal.equals(Result.waiting(Result.success(1)), Result.waiting(Result.success(1))))
assert.isFalse(Equal.equals(Result.waiting(Result.success(1)), Result.waiting(Result.success(2))))
// BUG: wait until Exit equals is fixed
// assert.isTrue(Equal.equals(Result.waiting(Result.success(1)), Result.success(1)))
})
it("`Result.equals` is symmetric", () => {
fc.assert(
fc.property(result, result, (resultA, resultB) => {
assert.strictEqual(
Equal.equals(resultA, resultB),
Equal.equals(resultB, resultA)
)
})
)
})
describe("JS Conventions", () => {
it("toString", () => {
assert.strictEqual(Result.initial().toString(), "Initial")
assert.strictEqual(Result.fail(1).toString(), "Failure(Error: 1)")
assert.strictEqual(Result.success(1).toString(), "Success(1)")
// I'm not checking if Cause toString correctly, only if Result does.
assert.strictEqual(Result.waiting(Result.success(1)).toString(), "Waiting(Success(1))")
})
it("toJSON", () => {
assert.strictEqual(JSON.stringify(Result.initial()), JSON.stringify({ _tag: "Initial" }))
assert.strictEqual(JSON.stringify(Result.fail(1)), JSON.stringify({ _tag: "Failure", cause: Cause.fail(1) }))
assert.strictEqual(JSON.stringify(Result.success(1)), JSON.stringify({ _tag: "Success", value: 1 }))
assert.strictEqual(
JSON.stringify(Result.waiting(Result.success(1))),
JSON.stringify({ _tag: "Waiting", previous: Result.success(1) })
)
})
it("inspect", () => {
assert.strictEqual(inspect(Result.initial()), inspect({ _tag: "Initial" }))
assert.strictEqual(inspect(Result.fail(1)), inspect({ _tag: "Failure", cause: Cause.fail(1) }))
assert.strictEqual(inspect(Result.success(1)), inspect({ _tag: "Success", value: 1 }))
assert.strictEqual(
inspect(Result.waiting(Result.success(1))),
inspect({ _tag: "Waiting", previous: Result.success(1) })
)
})
})
describe("mapping", () => {
it("map", () => {
const f = Result.map(S.length)
assert.deepEqual(f(Result.success("abc")), Result.success(3))
assert.deepEqual(f(Result.fail("abc")), Result.fail("abc"))
assert.deepEqual(f(Result.initial()), Result.initial())
assert.deepEqual(f(Result.waiting(Result.success("abc"))), Result.waiting(Result.success(3)))
})
it("as", () => {
const f = Result.as(0)
assert.deepStrictEqual(f(Result.success("abc")), Result.success(0))
assert.deepStrictEqual(f(Result.fail("abc")), Result.fail("abc"))
assert.deepStrictEqual(f(Result.initial()), Result.initial())
assert.deepStrictEqual(f(Result.waiting(Result.success("abc"))), Result.waiting(Result.success(0)))
})
})
describe("transforming", () => {
it("flatMap", () => {
const f = Result.flatMap((_: number) => Result.success(_ * 2))
assert.deepStrictEqual(f(Result.success(2)), Result.success(4))
assert.deepStrictEqual(f(Result.fail("abc")), Result.fail("abc"))
assert.deepStrictEqual(f(Result.initial()), Result.initial())
assert.deepStrictEqual(f(Result.waiting(Result.success(2))), Result.waiting(Result.success(4)))
})
it("flatten", () => {
const f = Result.flatten
assert.deepStrictEqual(f(Result.success(Result.success(1))), Result.success(1))
assert.deepStrictEqual(f(Result.fail("abc")), Result.fail("abc"))
assert.deepStrictEqual(f(Result.initial()), Result.initial())
assert.deepStrictEqual(f(Result.waiting(Result.success(Result.success(1)))), Result.waiting(Result.success(1)))
})
})
describe("refinements", () => {
it("isResult", () => {
fc.assert(
fc.property(fc.anything(), (_) => {
assert.isFalse(Result.isResult(_))
})
)
fc.assert(
fc.property(result, (_) => {
assert.isTrue(Result.isResult(_))
})
)
})
it("isInitial", () => {
assert.isTrue(Result.isInitial(Result.initial()))
assert.isFalse(Result.isInitial(Result.waiting(Result.initial())))
assert.isFalse(Result.isInitial(Result.fail(1)))
assert.isFalse(Result.isInitial(Result.success(1)))
assert.isFalse(Result.isInitial(Result.waiting(Result.success(1))))
})
it("isSuccess", () => {
assert.isFalse(Result.isSuccess(Result.initial()))
assert.isFalse(Result.isSuccess(Result.waiting(Result.initial())))
assert.isFalse(Result.isSuccess(Result.fail(1)))
assert.isTrue(Result.isSuccess(Result.success(1)))
assert.isFalse(Result.isSuccess(Result.waiting(Result.success(1))))
})
it("isFailure", () => {
assert.isFalse(Result.isFailure(Result.initial()))
assert.isFalse(Result.isFailure(Result.waiting(Result.initial())))
assert.isTrue(Result.isFailure(Result.fail(1)))
assert.isFalse(Result.isFailure(Result.success(1)))
assert.isFalse(Result.isFailure(Result.waiting(Result.success(1))))
})
it("isLoading", () => {
assert.isFalse(Result.isLoading(Result.initial()))
assert.isTrue(Result.isLoading(Result.waiting(Result.initial())))
assert.isFalse(Result.isLoading(Result.fail(1)))
assert.isFalse(Result.isLoading(Result.success(1)))
assert.isFalse(Result.isLoading(Result.waiting(Result.success(1))))
assert.isFalse(Result.isLoading(Result.waiting(Result.success(1))))
assert.isFalse(Result.isLoading(Result.waiting(Result.fail(1))))
})
it("isRetrying", () => {
assert.isFalse(Result.isRetrying(Result.initial()))
assert.isFalse(Result.isRetrying(Result.waiting(Result.initial())))
assert.isFalse(Result.isRetrying(Result.fail(1)))
assert.isFalse(Result.isRetrying(Result.success(1)))
assert.isFalse(Result.isRetrying(Result.waiting(Result.success(1))))
assert.isTrue(Result.isRetrying(Result.waiting(Result.fail(1))))
})
it("isRefreshing", () => {
assert.isFalse(Result.isRefreshing(Result.initial()))
assert.isFalse(Result.isRefreshing(Result.waiting(Result.initial())))
assert.isFalse(Result.isRefreshing(Result.fail(1)))
assert.isFalse(Result.isRefreshing(Result.success(1)))
assert.isTrue(Result.isRefreshing(Result.waiting(Result.success(1))))
assert.isFalse(Result.isRefreshing(Result.waiting(Result.fail(1))))
})
})
describe("getters", () => {
it("getValue", () => {
assert.deepStrictEqual(Result.getValue(Result.initial()), O.none())
assert.deepStrictEqual(Result.getValue(Result.success(1)), O.some(1))
assert.deepStrictEqual(Result.getValue(Result.fail(1)), O.none())
assert.deepStrictEqual(Result.getValue(Result.waiting(Result.success(1))), O.some(1))
assert.deepStrictEqual(Result.getValue(Result.waiting(Result.fail(1))), O.none())
})
it("getFailure", () => {
assert.deepStrictEqual(Result.getFailure(Result.initial()), O.none())
assert.deepStrictEqual(Result.getFailure(Result.success(1)), O.none())
assert.deepStrictEqual(Result.getFailure(Result.fail(1)), O.some(1))
assert.deepStrictEqual(Result.getFailure(Result.waiting(Result.success(1))), O.none())
assert.deepStrictEqual(Result.getFailure(Result.waiting(Result.fail(1))), O.some(1))
})
it("getExit", () => {
assert.deepStrictEqual(
Result.getExit(Result.initial()),
Exit.fail(Cause.NoSuchElementException("Result is in its initial state"))
)
assert.deepStrictEqual(Result.getExit(Result.success(1)), Exit.succeed(1))
assert.deepStrictEqual(Result.getExit(Result.fail(1)), Exit.fail(1))
assert.deepStrictEqual(Result.getExit(Result.waiting(Result.success(1))), Exit.succeed(1))
assert.deepStrictEqual(Result.getExit(Result.waiting(Result.fail(1))), Exit.fail(1))
})
})
describe("constructors", () => {
it("fromExit", () => {
assert.deepStrictEqual(Result.fromExit(Exit.succeed(1)), Result.success(1))
assert.deepStrictEqual(Result.fromExit(Exit.fail(1)), Result.fail(1))
})
})
})