Skip to content

Commit b360d32

Browse files
feat: introduce tapThru function to result. (#193)
1 parent c695fcd commit b360d32

File tree

3 files changed

+170
-4
lines changed

3 files changed

+170
-4
lines changed

src/result/result.interface.ts

+18
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,24 @@ export interface IResult<T, E> {
4444
* Convert Ok result into Fail using a provided value
4545
*/
4646
toFailWhenOkFrom(val: E): IResult<T, E>
47+
48+
/**
49+
* Execute a function with side-effects.
50+
* Returns this to continue operations
51+
*/
52+
tapThru(val: Partial<IResultMatchPattern<T, E, void>>): IResult<T, E>
53+
54+
/**
55+
* Execute a function with side-effects when maybe is a OK.
56+
* Returns this to continue operations
57+
*/
58+
tapOkThru(fn: (val: T) => void): IResult<T, E>
59+
60+
/**
61+
* Execute a function with side-effects when maybe is a Fail.
62+
* Returns this to continue operations
63+
*/
64+
tapFailThru(fn: (val: E) => void): IResult<T, E>
4765
}
4866

4967
export interface IResultOk<T, E = never> extends IResult<T, E> {

src/result/result.spec.ts

+121-4
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ describe('result', () => {
203203
describe('tap', () => {
204204
it('should tap.ok', done => {
205205
const sut = ok(1)
206-
206+
207207
sut.tap({
208208
ok: num => {
209209
expect(num).toEqual(1)
@@ -215,7 +215,7 @@ describe('result', () => {
215215

216216
it('should tap.ok', done => {
217217
const sut = fail<number, string>('failed')
218-
218+
219219
sut.tap({
220220
fail: str => {
221221
expect(str).toEqual('failed')
@@ -227,7 +227,7 @@ describe('result', () => {
227227

228228
it('should tapOk', done => {
229229
const sut = ok<number, string>(1)
230-
230+
231231
sut.tapOk(num => {
232232
expect(num).toEqual(1)
233233
done()
@@ -241,7 +241,7 @@ describe('result', () => {
241241

242242
it('should tapFail', done => {
243243
const sut = fail<number, string>('failed')
244-
244+
245245
sut.tapFail(err => {
246246
expect(err).toEqual('failed')
247247
done()
@@ -252,5 +252,122 @@ describe('result', () => {
252252
done()
253253
})
254254
})
255+
256+
it('should tapThru', done => {
257+
const result = ok<number, string>(1)
258+
259+
let sideEffect = 0
260+
261+
const sut = result.tapOkThru(v => {
262+
sideEffect = v
263+
}).map(a => a + 2)
264+
265+
expect(sut.unwrap()).toEqual(3)
266+
expect(sideEffect).toEqual(1)
267+
268+
done()
269+
})
270+
271+
it('should tapThru failed side', done => {
272+
const result = fail<number, string>('failed')
273+
274+
let sideEffect = 0
275+
276+
const sut = result.tapOkThru(v => {
277+
sideEffect = v
278+
}).map(a => a + 2)
279+
280+
expect(sut.unwrapFail()).toEqual('failed')
281+
expect(sideEffect).toEqual(0)
282+
283+
done()
284+
})
285+
286+
it('should tapFailThru', done => {
287+
const result = fail<number, string>('failed')
288+
289+
let sideEffect = ''
290+
291+
const sut = result.tapFailThru(v => {
292+
sideEffect = v + ' inside'
293+
}).map(a => a + 2)
294+
295+
expect(sut.unwrapFail()).toEqual('failed')
296+
expect(sideEffect).toEqual('failed inside')
297+
298+
done()
299+
})
300+
301+
it('should tapFailThru Ok side', done => {
302+
const result = ok<number, string>(1)
303+
304+
let sideEffect = ''
305+
306+
const sut = result.tapFailThru(v => {
307+
sideEffect = v + ' inside'
308+
}).map(a => a + 2)
309+
310+
expect(sut.unwrap()).toEqual(3)
311+
expect(sideEffect).toEqual('')
312+
313+
done()
314+
})
315+
316+
it('should tapThru', done => {
317+
const result = ok<number, string>(1)
318+
319+
let sideEffect = 0
320+
321+
const sut = result.tapThru({
322+
ok: v => {
323+
sideEffect = v
324+
}
325+
}).map(a => a + 2)
326+
327+
expect(sut.unwrap()).toEqual(3)
328+
expect(sideEffect).toEqual(1)
329+
330+
done()
331+
})
332+
333+
it('should tapThru', done => {
334+
const result = ok<number, string>(1)
335+
336+
let sideEffect = 0
337+
338+
const sut = result.tapThru({
339+
ok: v => {
340+
sideEffect = v
341+
},
342+
fail: f => {
343+
sideEffect = +f
344+
}
345+
}).map(a => a + 2)
346+
347+
expect(sut.unwrap()).toEqual(3)
348+
expect(sideEffect).toEqual(1)
349+
350+
done()
351+
})
352+
353+
it('should tapThru', done => {
354+
const result = fail<number, string>('failed')
355+
356+
let sideEffect = ''
357+
358+
const sut = result.tapThru({
359+
ok: v => {
360+
sideEffect = v + ''
361+
},
362+
fail: f => {
363+
sideEffect = f + ' in here'
364+
}
365+
}).map(a => a + 2)
366+
367+
expect(sut.unwrapFail()).toEqual('failed')
368+
expect(sideEffect).toEqual('failed in here')
369+
370+
done()
371+
})
255372
})
256373
})

src/result/result.ts

+31
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ export abstract class Result<TOk, TFail> implements IResult<TOk, TFail> {
2626
abstract tap(val: IResultMatchPattern<TOk, TFail, void>): void
2727
abstract tapOk(f: (val: TOk) => void): void
2828
abstract tapFail(f: (val: TFail) => void): void
29+
abstract tapThru(val: Partial<IResultMatchPattern<TOk, TFail, void>>): IResult<TOk, TFail>
30+
abstract tapOkThru(fn: (val: TOk) => void): IResult<TOk, TFail>
31+
abstract tapFailThru(fn: (val: TFail) => void): IResult<TOk, TFail>
2932
}
3033

3134
export class OkResult<TOk, TFail> extends Result<TOk, TFail> {
@@ -94,6 +97,20 @@ export class OkResult<TOk, TFail> extends Result<TOk, TFail> {
9497
}
9598

9699
tapFail(): void { }
100+
101+
tapFailThru(): IResult<TOk, TFail> {
102+
return this
103+
}
104+
105+
tapOkThru(fn: (val: TOk) => void): IResult<TOk, TFail> {
106+
this.tapOk(fn)
107+
return this
108+
}
109+
110+
tapThru(val: Partial<IResultMatchPattern<TOk, TFail, void>>): IResult<TOk, TFail> {
111+
this.tap(val)
112+
return this
113+
}
97114
}
98115

99116
export class FailResult<TOk, TFail> extends Result<TOk, TFail> implements IResult<TOk, TFail> {
@@ -162,4 +179,18 @@ export class FailResult<TOk, TFail> extends Result<TOk, TFail> implements IResul
162179
tapFail(fn: (val: TFail) => void): void {
163180
fn(this.failureValue)
164181
}
182+
183+
tapFailThru(fn: (val: TFail) => void): IResult<TOk, TFail> {
184+
this.tapFail(fn)
185+
return this
186+
}
187+
188+
tapOkThru(): IResult<TOk, TFail> {
189+
return this
190+
}
191+
192+
tapThru(val: Partial<IResultMatchPattern<TOk, TFail, void>>): IResult<TOk, TFail> {
193+
this.tap(val)
194+
return this
195+
}
165196
}

0 commit comments

Comments
 (0)