ngx-remotedata
Version:
RemoteData: Slaying a UI Antipattern with Angular
126 lines • 15.2 kB
JavaScript
import { Observable } from 'rxjs';
// ----------------------------
//
// Constructor functions
//
// ----------------------------
export const notAsked = () => {
return { tag: 'NotAsked' };
};
export const inProgress = (value) => {
return { tag: 'InProgress', value };
};
export const failure = (error, value) => {
return { tag: 'Failure', error, value };
};
export const success = (value) => {
return { tag: 'Success', value };
};
// ----------------------------
//
// Guards
//
// ----------------------------
export const isNotAsked = (value) => {
return (value !== null &&
value !== undefined &&
value.hasOwnProperty('tag') &&
value.tag === 'NotAsked');
};
export const isInProgress = (value) => {
return (value !== null &&
value !== undefined &&
value.hasOwnProperty('tag') &&
value.tag === 'InProgress');
};
export const isFailure = (value) => {
return (value !== null &&
value !== undefined &&
value.hasOwnProperty('tag') &&
value.tag === 'Failure');
};
export const isSuccess = (value) => {
return (value !== null &&
value !== undefined &&
value.hasOwnProperty('tag') &&
value.tag === 'Success');
};
export const isRemoteData = (value) => {
const hasRemoteDataTag = (tag) => tag === 'NotAsked' ||
tag === 'InProgress' ||
tag === 'Success' ||
tag === 'Failure';
return (value !== null &&
value !== undefined &&
value.hasOwnProperty('tag') &&
hasRemoteDataTag(value.tag));
};
// ----------------------------
//
// Folds
//
// ----------------------------
export const fold = (onNotAsked, onInProgress, onFailure, onSuccess, rd) => {
switch (rd.tag) {
case 'NotAsked':
return onNotAsked();
case 'InProgress':
return onInProgress(rd.value);
case 'Failure':
return onFailure(rd.error, rd.value);
case 'Success':
return onSuccess(rd.value);
}
};
export const getOrElse = (rd, defaultValue) => {
switch (rd.tag) {
case 'Success':
return rd.value;
default:
return defaultValue;
}
};
// ----------------------------
//
// Transformations
//
// ----------------------------
export const map = (fn, rd) => isSuccess(rd) ? success(fn(rd.value)) : rd;
export const mapFailure = (fn, rd) => isFailure(rd) ? failure(fn(rd.error)) : rd;
export const chain = (fn, rd) => isSuccess(rd) ? fn(rd.value) : rd;
// ----------------------------
//
// RxJs specific
//
// ----------------------------
/**
* Emits only when source Observable is a Success
* @returns Success<T>
*/
export function filterSuccess() {
return (source) => new Observable(subscriber => {
source.subscribe({
next(value) {
if (isSuccess(value)) {
subscriber.next(value);
}
}
});
});
}
/**
* Emits only when source Observable is a Failure
* @returns Failure<E, T>
*/
export function filterFailure() {
return (source) => new Observable(subscriber => {
source.subscribe({
next(value) {
if (isFailure(value)) {
subscriber.next(value);
}
}
});
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVtb3RlZGF0YS9zcmMvbGliL3JlbW90ZS1kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUF3QmxDLCtCQUErQjtBQUMvQixFQUFFO0FBQ0YseUJBQXlCO0FBQ3pCLEVBQUU7QUFDRiwrQkFBK0I7QUFFL0IsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEdBQTBDLEVBQUU7SUFDbEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUM3QixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FDeEIsS0FBUyxFQUNTLEVBQUU7SUFDcEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDdEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQ3JCLEtBQVEsRUFDUixLQUFTLEVBQ1MsRUFBRTtJQUNwQixPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDMUMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQXNCLEtBQVEsRUFBb0IsRUFBRTtJQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNuQyxDQUFDLENBQUM7QUFFRiwrQkFBK0I7QUFDL0IsRUFBRTtBQUNGLFVBQVU7QUFDVixFQUFFO0FBQ0YsK0JBQStCO0FBRS9CLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFPLEtBQWMsRUFBcUIsRUFBRTtJQUNwRSxPQUFPLENBQ0wsS0FBSyxLQUFLLElBQUk7UUFDZCxLQUFLLEtBQUssU0FBUztRQUNsQixLQUFnQixDQUFDLGNB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SztnQkFDUixJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDcEIsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDeEI7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG50eXBlIERlZmF1bHRFcnJvciA9IHN0cmluZztcblxuZXhwb3J0IGludGVyZmFjZSBOb3RBc2tlZCB7XG4gIHJlYWRvbmx5IHRhZzogJ05vdEFza2VkJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJblByb2dyZXNzPFQ+IHtcbiAgcmVhZG9ubHkgdGFnOiAnSW5Qcm9ncmVzcyc7XG4gIHJlYWRvbmx5IHZhbHVlOiBUIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZhaWx1cmU8RSwgVD4ge1xuICByZWFkb25seSB0YWc6ICdGYWlsdXJlJztcbiAgcmVhZG9ubHkgdmFsdWU6IFQgfCB1bmRlZmluZWQ7XG4gIGVycm9yOiBFO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1Y2Nlc3M8VD4ge1xuICByZWFkb25seSB0YWc6ICdTdWNjZXNzJztcbiAgcmVhZG9ubHkgdmFsdWU6IFQ7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG4vLyAgQ29uc3RydWN0b3IgZnVuY3Rpb25zXG4vL1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3Qgbm90QXNrZWQgPSA8VCwgRSA9IERlZmF1bHRFcnJvcj4oKTogUmVtb3RlRGF0YTxULCBFPiA9PiB7XG4gIHJldHVybiB7IHRhZzogJ05vdEFza2VkJyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGluUHJvZ3Jlc3MgPSA8VCwgRSA9IERlZmF1bHRFcnJvcj4oXG4gIHZhbHVlPzogVFxuKTogUmVtb3RlRGF0YTxULCBFPiA9PiB7XG4gIHJldHVybiB7IHRhZzogJ0luUHJvZ3Jlc3MnLCB2YWx1ZSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGZhaWx1cmUgPSA8VCwgRSA9IERlZmF1bHRFcnJvcj4oXG4gIGVycm9yOiBFLFxuICB2YWx1ZT86IFRcbik6IFJlbW90ZURhdGE8VCwgRT4gPT4ge1xuICByZXR1cm4geyB0YWc6ICdGYWlsdXJlJywgZXJyb3IsIHZhbHVlIH07XG59O1xuXG5leHBvcnQgY29uc3Qgc3VjY2VzcyA9IDxULCBFID0gRGVmYXVsdEVycm9yPih2YWx1ZTogVCk6IFJlbW90ZURhdGE8VCwgRT4gPT4ge1xuICByZXR1cm4geyB0YWc6ICdTdWNjZXNzJywgdmFsdWUgfTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG4vLyAgR3VhcmRzXG4vL1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgaXNOb3RBc2tlZCA9IDxULCBFPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIE5vdEFza2VkID0+IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAodmFsdWUgYXMgb2JqZWN0KS5oYXNPd25Qcm9wZXJ0eSgndGFnJykgJiZcbiAgICAodmFsdWUgYXMgUmVtb3RlRGF0YTxULCBFPikudGFnID09PSAnTm90QXNrZWQnXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNJblByb2dyZXNzID0gPFQsIEU+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgSW5Qcm9ncmVzczxUPiA9PiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgKHZhbHVlIGFzIG9iamVjdCkuaGFzT3duUHJvcGVydHkoJ3RhZycpICYmXG4gICAgKHZhbHVlIGFzIFJlbW90ZURhdGE8VCwgRT4pLnRhZyA9PT0gJ0luUHJvZ3Jlc3MnXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNGYWlsdXJlID0gPFQsIEU+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRmFpbHVyZTxFLCBUPiA9PiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgKHZhbHVlIGFzIG9iamVjdCkuaGFzT3duUHJvcGVydHkoJ3RhZycpICYmXG4gICAgKHZhbHVlIGFzIFJlbW90ZURhdGE8VCwgRT4pLnRhZyA9PT0gJ0ZhaWx1cmUnXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNTdWNjZXNzID0gPFQsIEU+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgU3VjY2VzczxUPiA9PiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgKHZhbHVlIGFzIG9iamVjdCkuaGFzT3duUHJvcGVydHkoJ3RhZycpICYmXG4gICAgKHZhbHVlIGFzIFJlbW90ZURhdGE8VCwgRT4pLnRhZyA9PT0gJ1N1Y2Nlc3MnXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNSZW1vdGVEYXRhID0gPFQsIEUgPSBEZWZhdWx0RXJyb3I+KFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgUmVtb3RlRGF0YTxULCBFPiA9PiB7XG4gIGNvbnN0IGhhc1JlbW90ZURhdGFUYWcgPSAodGFnOiBSZW1vdGVEYXRhPGFueSwgYW55PlsndGFnJ10pID0+XG4gICAgdGFnID09PSAnTm90QXNrZWQnIHx8XG4gICAgdGFnID09PSAnSW5Qcm9ncmVzcycgfHxcbiAgICB0YWcgPT09ICdTdWNjZXNzJyB8fFxuICAgIHRhZyA9PT0gJ0ZhaWx1cmUnO1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICh2YWx1ZSBhcyBvYmplY3QpLmhhc093blByb3BlcnR5KCd0YWcnKSAmJlxuICAgIGhhc1JlbW90ZURhdGFUYWcoKHZhbHVlIGFzIFJlbW90ZURhdGE8VCwgRT4pLnRhZylcbiAgKTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG4vLyAgRm9sZHNcbi8vXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBmb2xkID0gPFQsIEU+KFxuICBvbk5vdEFza2VkOiAoKSA9PiBULFxuICBvbkluUHJvZ3Jlc3M6ICh2YWx1ZTogVCB8IHVuZGVmaW5lZCkgPT4gVCxcbiAgb25GYWlsdXJlOiAoZXJyb3I6IEUsIHZhbHVlOiBUIHwgdW5kZWZpbmVkKSA9PiBULFxuICBvblN1Y2Nlc3M6ICh2YWx1ZTogVCkgPT4gVCxcbiAgcmQ6IFJlbW90ZURhdGE8VCwgRT5cbik6IFQgPT4ge1xuICBzd2l0Y2ggKHJkLnRhZykge1xuICAgIGNhc2UgJ05vdEFza2VkJzpcbiAgICAgIHJldHVybiBvbk5vdEFza2VkKCk7XG4gICAgY2FzZSAnSW5Qcm9ncmVzcyc6XG4gICAgICByZXR1cm4gb25JblByb2dyZXNzKHJkLnZhbHVlKTtcbiAgICBjYXNlICdGYWlsdXJlJzpcbiAgICAgIHJldHVybiBvbkZhaWx1cmUocmQuZXJyb3IsIHJkLnZhbHVlKTtcbiAgICBjYXNlICdTdWNjZXNzJzpcbiAgICAgIHJldHVybiBvblN1Y2Nlc3MocmQudmFsdWUpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0T3JFbHNlID0gPFQsIEU+KHJkOiBSZW1vdGVEYXRhPFQsIEU+LCBkZWZhdWx0VmFsdWU6IFQpOiBUID0+IHtcbiAgc3dpdGNoIChyZC50YWcpIHtcbiAgICBjYXNlICdTdWNjZXNzJzpcbiAgICAgIHJldHVybiByZC52YWx1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy9cbi8vICBUcmFuc2Zvcm1hdGlvbnNcbi8vXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBtYXAgPSA8QSwgQiwgRT4oXG4gIGZuOiAoYTogQSkgPT4gQixcbiAgcmQ6IFJlbW90ZURhdGE8QSwgRT5cbik6IFJlbW90ZURhdGE8QiwgRT4gPT5cbiAgaXNTdWNjZXNzKHJkKSA/IHN1Y2Nlc3MoZm4ocmQudmFsdWUpKSA6IChyZCBhcyBSZW1vdGVEYXRhPEIsIEU+KTtcblxuZXhwb3J0IGNvbnN0IG1hcEZhaWx1cmUgPSA8QSwgRSwgRj4oXG4gIGZuOiAoZTogRSkgPT4gRixcbiAgcmQ6IFJlbW90ZURhdGE8QSwgRT5cbik6IFJlbW90ZURhdGE8QSwgRj4gPT5cbiAgaXNGYWlsdXJlKHJkKSA/IGZhaWx1cmUoZm4ocmQuZXJyb3IpKSA6IChyZCBhcyBSZW1vdGVEYXRhPEEsIEY+KTtcblxuZXhwb3J0IGNvbnN0IGNoYWluID0gPEEsIEIsIEU+KFxuICBmbjogKGE6IEEpID0+IFJlbW90ZURhdGE8QiwgRT4sXG4gIHJkOiBSZW1vdGVEYXRhPEEsIEU+XG4pOiBSZW1vdGVEYXRhPEIsIEU+ID0+XG4gIGlzU3VjY2VzcyhyZCkgPyBmbihyZC52YWx1ZSkgOiAocmQgYXMgUmVtb3RlRGF0YTxCLCBFPik7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG4vLyAgUnhKcyBzcGVjaWZpY1xuLy9cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBFbWl0cyBvbmx5IHdoZW4gc291cmNlIE9ic2VydmFibGUgaXMgYSBTdWNjZXNzXG4gKiBAcmV0dXJucyBTdWNjZXNzPFQ+XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJTdWNjZXNzKCkge1xuICByZXR1cm4gPFQsIEU+KHNvdXJjZTogT2JzZXJ2YWJsZTxSZW1vdGVEYXRhPFQsIEU+Pik6IE9ic2VydmFibGU8U3VjY2VzczxUPj4gPT5cbiAgICBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHtcbiAgICAgIHNvdXJjZS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGlzU3VjY2Vzcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBFbWl0cyBvbmx5IHdoZW4gc291cmNlIE9ic2VydmFibGUgaXMgYSBGYWlsdXJlXG4gKiBAcmV0dXJucyBGYWlsdXJlPEUsIFQ+XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJGYWlsdXJlKCkge1xuICByZXR1cm4gPFQsIEU+KFxuICAgIHNvdXJjZTogT2JzZXJ2YWJsZTxSZW1vdGVEYXRhPFQsIEU+PlxuICApOiBPYnNlcnZhYmxlPEZhaWx1cmU8RSwgVD4+ID0+XG4gICAgbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiB7XG4gICAgICBzb3VyY2Uuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgIGlmIChpc0ZhaWx1cmUodmFsdWUpKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG4vLyAgUmVtb3RlRGF0YSB0eXBlXG4vL1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgdHlwZSBSZW1vdGVEYXRhPFQsIEUgPSBzdHJpbmc+ID1cbiAgfCBOb3RBc2tlZFxuICB8IEluUHJvZ3Jlc3M8VD5cbiAgfCBGYWlsdXJlPEUsIFQ+XG4gIHwgU3VjY2VzczxUPjtcbiJdfQ==