multitude
Version:
Comprehensive streams for push and pull
105 lines (91 loc) • 11 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useObservable = useObservable;
exports.usePropsMulticast = usePropsMulticast;
var _from = require("../creators/from");
var _Multicast = require("../classes/Multicast");
var _typeCore = require("type-core");
function useObservable(React, observable, projection) {
const state = React.useState(0);
const store = React.useMemo(() => {
const members = {
subscription: null,
result: null,
response: null
};
let i = 0;
let open = false;
let updated = false;
function update(value) {
updated = true;
const previous = members.response;
members.result = value;
members.response = projection ? projection(value) : value;
if (open && members.response !== previous) state[1](i = i + 1);
}
(0, _from.from)(_typeCore.TypeGuard.isFunction(observable) ? observable() : observable).subscribe({
start(subscription) {
members.subscription = subscription;
},
next(item) {
update({
success: true,
done: false,
data: item
});
},
error(reason) {
update({
success: false,
done: true,
data: reason
});
},
complete() {
update(members.result && members.result.success ? {
success: true,
done: true,
data: members.result.data
} : {
success: false,
done: true,
data: Error(`Observable completed before pushing any value`)
});
}
});
open = true;
if (!updated && projection) members.response = projection(null);
return members;
}, []);
React.useEffect(() => () => {
if (store.subscription) store.subscription.unsubscribe();
}, []);
return store.response;
}
function usePropsMulticast(React, props, projection) {
const store = React.useMemo(() => {
let observer;
const multicast = new _Multicast.Multicast(obs => {
observer = obs;
}, {
replay: true
}, {
onCreate: connect => connect()
});
observer.next(projection ? projection(props) : props);
return {
props,
observer,
multicast
};
}, []);
if (props !== store.props) {
store.props = props;
const value = projection ? projection(props) : props;
if (value !== store.multicast.value) store.observer.next(value);
}
return store.multicast;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wdXNoL3V0aWxzL3JlYWN0LnRzIl0sIm5hbWVzIjpbInVzZU9ic2VydmFibGUiLCJSZWFjdCIsIm9ic2VydmFibGUiLCJwcm9qZWN0aW9uIiwic3RhdGUiLCJ1c2VTdGF0ZSIsInN0b3JlIiwidXNlTWVtbyIsIm1lbWJlcnMiLCJzdWJzY3JpcHRpb24iLCJyZXN1bHQiLCJyZXNwb25zZSIsImkiLCJvcGVuIiwidXBkYXRlZCIsInVwZGF0ZSIsInZhbHVlIiwicHJldmlvdXMiLCJUeXBlR3VhcmQiLCJpc0Z1bmN0aW9uIiwic3Vic2NyaWJlIiwic3RhcnQiLCJuZXh0IiwiaXRlbSIsInN1Y2Nlc3MiLCJkb25lIiwiZGF0YSIsImVycm9yIiwicmVhc29uIiwiY29tcGxldGUiLCJFcnJvciIsInVzZUVmZmVjdCIsInVuc3Vic2NyaWJlIiwidXNlUHJvcHNNdWx0aWNhc3QiLCJwcm9wcyIsIm9ic2VydmVyIiwibXVsdGljYXN0IiwiTXVsdGljYXN0Iiwib2JzIiwicmVwbGF5Iiwib25DcmVhdGUiLCJjb25uZWN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQVlPLFNBQVNBLGFBQVQsQ0FDTEMsS0FESyxFQUVMQyxVQUZLLEVBR0xDLFVBSEssRUFJRjtBQUNILFFBQU1DLEtBQUssR0FBR0gsS0FBSyxDQUFDSSxRQUFOLENBQWUsQ0FBZixDQUFkO0FBRUEsUUFBTUMsS0FBSyxHQUFHTCxLQUFLLENBQUNNLE9BQU4sQ0FBYyxNQUFNO0FBQ2hDLFVBQU1DLE9BQU8sR0FBRztBQUNkQyxNQUFBQSxZQUFZLEVBQUUsSUFEQTtBQUVkQyxNQUFBQSxNQUFNLEVBQUUsSUFGTTtBQUdkQyxNQUFBQSxRQUFRLEVBQUU7QUFISSxLQUFoQjtBQU1BLFFBQUlDLENBQUMsR0FBRyxDQUFSO0FBQ0EsUUFBSUMsSUFBSSxHQUFHLEtBQVg7QUFDQSxRQUFJQyxPQUFPLEdBQUcsS0FBZDs7QUFDQSxhQUFTQyxNQUFULENBQWdC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QUFRQU4sSUFBQUEsUUFBUSxDQUFDYixJQUFULENBQWNuQixVQUFVLEdBQUdBLFVBQVUsQ0FBQytCLEtBQUQsQ0FBYixHQUF1QkEsS0FBL0M7QUFFQSxXQUFPO0FBQUVBLE1BQUFBLEtBQUY7QUFBU0MsTUFBQUEsUUFBVDtBQUFtQkMsTUFBQUE7QUFBbkIsS0FBUDtBQUNELEdBZGEsRUFjWCxFQWRXLENBQWQ7O0FBZ0JBLE1BQUlGLEtBQUssS0FBSzVCLEtBQUssQ0FBQzRCLEtBQXBCLEVBQTJCO0FBQ3pCNUIsSUFBQUEsS0FBSyxDQUFDNEIsS0FBTixHQUFjQSxLQUFkO0FBQ0EsVUFBTWxCLEtBQUssR0FBR2IsVUFBVSxHQUFHQSxVQUFVLENBQUMrQixLQUFELENBQWIsR0FBdUJBLEtBQS9DO0FBQ0EsUUFBSWxCLEtBQUssS0FBS1YsS0FBSyxDQUFDOEIsU0FBTixDQUFnQnBCLEtBQTlCLEVBQXFDVixLQUFLLENBQUM2QixRQUFOLENBQWViLElBQWYsQ0FBb0JOLEtBQXBCO0FBQ3RDOztBQUVELFNBQU9WLEtBQUssQ0FBQzhCLFNBQWI7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFB1c2ggfSBmcm9tICdAZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgZnJvbSB9IGZyb20gJy4uL2NyZWF0b3JzL2Zyb20nO1xuaW1wb3J0IHsgTXVsdGljYXN0IH0gZnJvbSAnLi4vY2xhc3Nlcy9NdWx0aWNhc3QnO1xuaW1wb3J0IHsgTnVsbGFyeUZuLCBUeXBlR3VhcmQsIFVuYXJ5Rm4gfSBmcm9tICd0eXBlLWNvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWN0SG9va3NEZXBlbmRlbmN5IHtcbiAgdXNlU3RhdGU8Uz4oaW5pdGlhbDogUyk6IFtTLCBVbmFyeUZuPFM+XTtcbiAgdXNlTWVtbzxUPihmYWN0b3J5OiAoKSA9PiBULCBkZXBzPzogYW55W10pOiBUO1xuICB1c2VFZmZlY3QoZWZmZWN0OiBOdWxsYXJ5Rm48dm9pZCB8IE51bGxhcnlGbj4sIGRlcHM/OiBhbnlbXSk6IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIE9ic2VydmFibGVIb29rUmVzdWx0PFQ+ID1cbiAgfCB7IHN1Y2Nlc3M6IHRydWU7IGRvbmU6IGJvb2xlYW47IGRhdGE6IFQgfVxuICB8IHsgc3VjY2VzczogZmFsc2U7IGRvbmU6IHRydWU7IGRhdGE6IEVycm9yIH07XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VPYnNlcnZhYmxlPFQsIFUgPSBPYnNlcnZhYmxlSG9va1Jlc3VsdDxUPiB8IG51bGw+KFxuICBSZWFjdDogUmVhY3RIb29rc0RlcGVuZGVuY3ksXG4gIG9ic2VydmFibGU6IFB1c2guQ29udmVydGlibGU8VD4gfCBOdWxsYXJ5Rm48UHVzaC5Db252ZXJ0aWJsZTxUPj4sXG4gIHByb2plY3Rpb24/OiBVbmFyeUZuPE9ic2VydmFibGVIb29rUmVzdWx0PFQ+IHwgbnVsbCwgVT5cbik6IFUge1xuICBjb25zdCBzdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKDApO1xuXG4gIGNvbnN0IHN0b3JlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbWVtYmVycyA9IHtcbiAgICAgIHN1YnNjcmlwdGlvbjogbnVsbCBhcyBudWxsIHwgUHVzaC5TdWJzY3JpcHRpb24sXG4gICAgICByZXN1bHQ6IG51bGwgYXMgT2JzZXJ2YWJsZUhvb2tSZXN1bHQ8VD4gfCBudWxsLFxuICAgICAgcmVzcG9uc2U6IG51bGwgYXMgVSB8IG51bGxcbiAgICB9O1xuXG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBvcGVuID0gZmFsc2U7XG4gICAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcbiAgICBmdW5jdGlvbiB1cGRhdGUodmFsdWU6IE9ic2VydmFibGVIb29rUmVzdWx0PFQ+IHwgbnVsbCk6IHZvaWQge1xuICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IG1lbWJlcnMucmVzcG9uc2U7XG4gICAgICBtZW1iZXJzLnJlc3VsdCA9IHZhbHVlO1xuICAgICAgbWVtYmVycy5yZXNwb25zZSA9IHByb2plY3Rpb24gPyBwcm9qZWN0aW9uKHZhbHVlKSA6ICh2YWx1ZSBhcyBhbnkpO1xuICAgICAgaWYgKG9wZW4gJiYgbWVtYmVycy5yZXNwb25zZSAhPT0gcHJldmlvdXMpIHN0YXRlWzFdKChpID0gaSArIDEpKTtcbiAgICB9XG5cbiAgICBmcm9tKFxuICAgICAgVHlwZUd1YXJkLmlzRnVuY3Rpb24ob2JzZXJ2YWJsZSkgPyBvYnNlcnZhYmxlKCkgOiBvYnNlcnZhYmxlXG4gICAgKS5zdWJzY3JpYmUoe1xuICAgICAgc3RhcnQoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIG1lbWJlcnMuc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uO1xuICAgICAgfSxcbiAgICAgIG5leHQoaXRlbSkge1xuICAgICAgICB1cGRhdGUoeyBzdWNjZXNzOiB0cnVlLCBkb25lOiBmYWxzZSwgZGF0YTogaXRlbSB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvcihyZWFzb24pIHtcbiAgICAgICAgdXBkYXRlKHsgc3VjY2VzczogZmFsc2UsIGRvbmU6IHRydWUsIGRhdGE6IHJlYXNvbiB9KTtcbiAgICAgIH0sXG4gICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgdXBkYXRlKFxuICAgICAgICAgIG1lbWJlcnMucmVzdWx0ICYmIG1lbWJlcnMucmVzdWx0LnN1Y2Nlc3NcbiAgICAgICAgICAgID8geyBzdWNjZXNzOiB0cnVlLCBkb25lOiB0cnVlLCBkYXRhOiBtZW1iZXJzLnJlc3VsdC5kYXRhIH1cbiAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGRvbmU6IHRydWUsXG4gICAgICAgICAgICAgICAgZGF0YTogRXJyb3IoYE9ic2VydmFibGUgY29tcGxldGVkIGJlZm9yZSBwdXNoaW5nIGFueSB2YWx1ZWApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG9wZW4gPSB0cnVlO1xuICAgIGlmICghdXBkYXRlZCAmJiBwcm9qZWN0aW9uKSBtZW1iZXJzLnJlc3BvbnNlID0gcHJvamVjdGlvbihudWxsKTtcbiAgICByZXR1cm4gbWVtYmVycztcbiAgfSwgW10pO1xuXG4gIFJlYWN0LnVzZUVmZmVjdChcbiAgICAoKSA9PiAoKSA9PiB7XG4gICAgICBpZiAoc3RvcmUuc3Vic2NyaXB0aW9uKSBzdG9yZS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9LFxuICAgIFtdXG4gICk7XG5cbiAgcmV0dXJuIHN0b3JlLnJlc3BvbnNlIGFzIFU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VQcm9wc011bHRpY2FzdDxQLCBSID0gUD4oXG4gIFJlYWN0OiBSZWFjdEhvb2tzRGVwZW5kZW5jeSxcbiAgcHJvcHM6IFAsXG4gIHByb2plY3Rpb24/OiBVbmFyeUZuPFAsIFI+XG4pOiBQdXNoLk11bHRpY2FzdDxSPiB7XG4gIGNvbnN0IHN0b3JlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgbGV0IG9ic2VydmVyOiBhbnk7XG5cbiAgICBjb25zdCBtdWx0aWNhc3QgPSBuZXcgTXVsdGljYXN0KFxuICAgICAgKG9icykgPT4ge1xuICAgICAgICBvYnNlcnZlciA9IG9icztcbiAgICAgIH0sXG4gICAgICB7IHJlcGxheTogdHJ1ZSB9LFxuICAgICAgeyBvbkNyZWF0ZTogKGNvbm5lY3QpID0+IGNvbm5lY3QoKSB9XG4gICAgKTtcblxuICAgIG9ic2VydmVyLm5leHQocHJvamVjdGlvbiA/IHByb2plY3Rpb24ocHJvcHMpIDogcHJvcHMpO1xuXG4gICAgcmV0dXJuIHsgcHJvcHMsIG9ic2VydmVyLCBtdWx0aWNhc3QgfTtcbiAgfSwgW10pO1xuXG4gIGlmIChwcm9wcyAhPT0gc3RvcmUucHJvcHMpIHtcbiAgICBzdG9yZS5wcm9wcyA9IHByb3BzO1xuICAgIGNvbnN0IHZhbHVlID0gcHJvamVjdGlvbiA/IHByb2plY3Rpb24ocHJvcHMpIDogcHJvcHM7XG4gICAgaWYgKHZhbHVlICE9PSBzdG9yZS5tdWx0aWNhc3QudmFsdWUpIHN0b3JlLm9ic2VydmVyLm5leHQodmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHN0b3JlLm11bHRpY2FzdDtcbn1cbiJdfQ==
;