Skip to content

Commit 27d5591

Browse files
committed
feat: add "recover" method
closes #12
1 parent 4c89823 commit 27d5591

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

src/__tests__/remote-data.spec.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,5 +719,20 @@ describe('RemoteData', () => {
719719
expect(success(1).exists(p)).toBe(true);
720720
});
721721
});
722+
describe('recover', () => {
723+
const f = (error: string) => (error === 'foo' ? some(1) : none);
724+
it('initial', () => {
725+
expect(initialRD.recover(f)).toBe(initialRD);
726+
});
727+
it('pending', () => {
728+
expect(pendingRD.recover(f)).toBe(pendingRD);
729+
});
730+
it('failure', () => {
731+
expect(failure<string, number>('foo').recover(f)).toEqual(success(1));
732+
});
733+
it('success', () => {
734+
expect(successRD.recover(f)).toBe(successRD);
735+
});
736+
});
722737
});
723738
});

src/remote-data.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,13 @@ export class RemoteInitial<L, A> {
347347
exists(p: Predicate<A>): boolean {
348348
return false;
349349
}
350+
351+
/**
352+
* Processes failure error into new RemoteData if function f return some value
353+
*/
354+
recover(f: (error: L) => Option<A>): RemoteData<L, A> {
355+
return this;
356+
}
350357
}
351358

352359
export class RemoteFailure<L, A> {
@@ -633,6 +640,13 @@ export class RemoteFailure<L, A> {
633640
exists(p: Predicate<A>): boolean {
634641
return false;
635642
}
643+
644+
/**
645+
* Processes failure error into new RemoteData if function f return some value
646+
*/
647+
recover(f: (error: L) => Option<A>): RemoteData<L, A> {
648+
return f(this.error).fold<RemoteData<L, A>>(this, success); //tslint:disable-line no-use-before-declare
649+
}
636650
}
637651

638652
export class RemoteSuccess<L, A> {
@@ -919,6 +933,13 @@ export class RemoteSuccess<L, A> {
919933
exists(p: Predicate<A>): boolean {
920934
return p(this.value);
921935
}
936+
937+
/**
938+
* Processes failure error into new RemoteData if function f return some value
939+
*/
940+
recover(f: (error: L) => Option<A>): RemoteData<L, A> {
941+
return this;
942+
}
922943
}
923944

924945
export class RemotePending<L, A> {
@@ -1210,6 +1231,13 @@ export class RemotePending<L, A> {
12101231
exists(p: Predicate<A>): boolean {
12111232
return false;
12121233
}
1234+
1235+
/**
1236+
* Processes failure error into new RemoteData if function f return some value
1237+
*/
1238+
recover(f: (error: L) => Option<A>): RemoteData<L, A> {
1239+
return this;
1240+
}
12131241
}
12141242

12151243
/**

0 commit comments

Comments
 (0)