srd
Version:
Static Land Compliant Remote Data Type in TypeScript
67 lines (65 loc) • 2.51 kB
JavaScript
var URI = 'RemoteData';
var notAsked = function () { return ({ tag: 'NotAsked' }); };
var loading = function () { return ({ tag: 'Loading' }); };
var failure = function (error) { return ({ tag: 'Failure', error: error }); };
var success = function (data) { return ({ tag: 'Success', data: data }); };
var isNotAsked = function (rd) { return rd.tag === 'NotAsked'; };
var isLoading = function (rd) { return rd.tag === 'Loading'; };
var isFailure = function (rd) { return rd.tag === 'Failure'; };
var isSuccess = function (rd) { return rd.tag === 'Success'; };
var SRD = {
URI: URI,
map: function (f, fa) { return isSuccess(fa) ? success(f(fa.data)) : fa; },
map2: function (f, fa, fb) {
return isSuccess(fa)
? isSuccess(fb)
? success(f(fa.data, fb.data))
: fb
: fa;
},
map3: function (f, fa, fb, fc) {
return isSuccess(fa)
? isSuccess(fb)
? isSuccess(fc)
? success(f(fa.data, fb.data, fc.data))
: fc
: fb
: fa;
},
mapFailure: function (f, fa) { return isFailure(fa) ? failure(f(fa.error)) : fa; },
chain: function (f, fa) { return isSuccess(fa) ? f(fa.data) : fa; },
bimap: function (failureFn, successFn, rd) {
return isSuccess(rd)
? success(successFn(rd.data))
: isFailure(rd)
? failure(failureFn(rd.error))
: rd;
},
ap: function (rdFn, rd) {
return isSuccess(rd)
? isSuccess(rdFn)
? success(rdFn.data(rd.data))
: rdFn
: rd;
},
alt: function (def, rd) { return isSuccess(rd) ? rd : def; },
of: success,
equals: function (a, b) { return a.tag === b.tag; },
unwrap: function (def, f, fa) { return isSuccess(fa) ? f(fa.data) : def; },
unpack: function (def, f, fa) { return isSuccess(fa) ? f(fa.data) : def(); },
withDefault: function (def, fa) { return isSuccess(fa) ? fa.data : def; },
match: function (mapper, fa) {
return isSuccess(fa)
? mapper.success(fa.data)
: isFailure(fa)
? mapper.failure(fa.error)
: isLoading(fa)
? mapper.loading()
: mapper.notAsked();
},
isSuccess: isSuccess,
isFailure: isFailure,
isLoading: isLoading,
isNotAsked: isNotAsked
};
export { SRD, failure, loading, notAsked, success };