Comparing version 0.1.4 to 0.2.0
328
lib/karet.js
@@ -12,6 +12,2 @@ "use strict"; | ||
var _ramda = require("ramda"); | ||
var R = _interopRequireWildcard(_ramda); | ||
var _react = require("react"); | ||
@@ -25,4 +21,2 @@ | ||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } | ||
@@ -38,2 +32,12 @@ | ||
var emptyArray = []; | ||
var dissoc = function dissoc(k, o) { | ||
var r = Object.assign({}, o); | ||
delete r[k]; | ||
return r; | ||
}; | ||
// | ||
var LiftedComponent = function (_React$Component) { | ||
@@ -45,6 +49,3 @@ _inherits(LiftedComponent, _React$Component); | ||
var _this = _possibleConstructorReturn(this, (LiftedComponent.__proto__ || Object.getPrototypeOf(LiftedComponent)).call(this, props)); | ||
_this.state = _this.theInitialState(); | ||
return _this; | ||
return _possibleConstructorReturn(this, (LiftedComponent.__proto__ || Object.getPrototypeOf(LiftedComponent)).call(this, props)); | ||
} | ||
@@ -61,21 +62,9 @@ | ||
value: function componentWillMount() { | ||
this.doUnsubscribe(); | ||
this.doSubscribe(this.props); | ||
} | ||
}, { | ||
key: "shouldComponentUpdate", | ||
value: function shouldComponentUpdate(np, ns) { | ||
return ns.rendered !== this.state.rendered; | ||
} | ||
}, { | ||
key: "componentWillUnmount", | ||
value: function componentWillUnmount() { | ||
this.doUnsubscribe(); | ||
this.setState(this.theInitialState()); | ||
} | ||
}, { | ||
key: "render", | ||
value: function render() { | ||
return this.state.rendered; | ||
} | ||
}]); | ||
@@ -88,5 +77,2 @@ | ||
var FromKefirEnd = { callback: null }; | ||
var FromKefirNull = { callback: null, rendered: null }; | ||
var FromKefir = function (_LiftedComponent) { | ||
@@ -98,15 +84,13 @@ _inherits(FromKefir, _LiftedComponent); | ||
return _possibleConstructorReturn(this, (FromKefir.__proto__ || Object.getPrototypeOf(FromKefir)).call(this, props)); | ||
var _this2 = _possibleConstructorReturn(this, (FromKefir.__proto__ || Object.getPrototypeOf(FromKefir)).call(this, props)); | ||
_this2.callback = null; | ||
_this2.rendered = null; | ||
return _this2; | ||
} | ||
_createClass(FromKefir, [{ | ||
key: "theInitialState", | ||
value: function theInitialState() { | ||
return FromKefirNull; | ||
} | ||
}, { | ||
key: "doUnsubscribe", | ||
value: function doUnsubscribe() { | ||
var callback = this.state.callback; | ||
var callback = this.callback; | ||
if (callback) this.props.observable.offAny(callback); | ||
@@ -125,3 +109,4 @@ } | ||
case "value": | ||
_this3.setState({ rendered: e.value }); | ||
_this3.rendered = e.value; | ||
_this3.forceUpdate(); | ||
break; | ||
@@ -131,12 +116,16 @@ case "error": | ||
case "end": | ||
_this3.setState(FromKefirEnd); | ||
break; | ||
_this3.callback = null; | ||
} | ||
}; | ||
this.callback = callback; | ||
observable.onAny(callback); | ||
this.setState({ callback: callback }); | ||
} else { | ||
this.setState({ rendered: observable }); | ||
this.rendered = observable; | ||
} | ||
} | ||
}, { | ||
key: "render", | ||
value: function render() { | ||
return this.rendered; | ||
} | ||
}]); | ||
@@ -190,5 +179,3 @@ | ||
var empty = []; | ||
function render(props, values) { | ||
function _render(props, values) { | ||
var type = void 0; | ||
@@ -251,3 +238,3 @@ var newProps = null; | ||
} | ||
return _react2.default.createElement.apply(_react2.default, [type, newProps].concat(_toConsumableArray(newChildren || empty))); | ||
return _react2.default.createElement.apply(_react2.default, [type, newProps].concat(_toConsumableArray(newChildren || emptyArray))); | ||
} | ||
@@ -257,125 +244,2 @@ | ||
function FakeComponent(state, props) { | ||
this.props = props; | ||
this.state = state; | ||
} | ||
FakeComponent.prototype.setState = function (newState) { | ||
if ("renderer" in newState) this.state.renderer = newState.renderer; | ||
if ("rendered" in newState) this.state.rendered = newState.rendered; | ||
}; | ||
// | ||
function Renderer1(component, newProps) { | ||
var _this4 = this; | ||
var state = { renderer: this, rendered: component.state.rendered }; | ||
this.component = new FakeComponent(state, newProps); | ||
this.handler = function (e) { | ||
return _this4.doHandle(e); | ||
}; | ||
forEach(newProps, function (observable) { | ||
return observable.onAny(_this4.handler); | ||
}); | ||
this.component = component; | ||
component.setState(state); | ||
} | ||
Renderer1.prototype.unsubscribe = function () { | ||
var handler = this.handler; | ||
if (handler) forEach(this.component.props, function (observable) { | ||
return observable.offAny(handler); | ||
}); | ||
}; | ||
Renderer1.prototype.doHandle = function (e) { | ||
switch (e.type) { | ||
case "value": | ||
{ | ||
var component = this.component; | ||
var rendered = render(component.props, [e.value]); | ||
if (!R.equals(component.state.rendered, rendered)) component.setState({ rendered: rendered }); | ||
return; | ||
} | ||
case "error": | ||
throw e.value; | ||
default: | ||
this.handler = null; | ||
this.component.setState(FromClassEnd); | ||
return; | ||
} | ||
}; | ||
// | ||
function RendererN(component, newProps, n) { | ||
var _this5 = this; | ||
var state = { renderer: this, rendered: component.state.rendered }; | ||
this.component = new FakeComponent(state, newProps); | ||
this.handlers = []; | ||
this.values = Array(n); | ||
for (var i = 0; i < n; ++i) { | ||
this.values[i] = this; | ||
}forEach(newProps, function (observable) { | ||
var i = _this5.handlers.length; | ||
var handler = function handler(e) { | ||
return _this5.doHandle(i, e); | ||
}; | ||
_this5.handlers.push(handler); | ||
observable.onAny(handler); | ||
}); | ||
this.component = component; | ||
component.setState(state); | ||
} | ||
RendererN.prototype.unsubscribe = function () { | ||
var _this6 = this; | ||
var i = -1; | ||
forEach(this.component.props, function (observable) { | ||
var handler = _this6.handlers[++i]; | ||
if (handler) observable.offAny(handler); | ||
}); | ||
}; | ||
RendererN.prototype.doHandle = function (idx, e) { | ||
switch (e.type) { | ||
case "value": | ||
{ | ||
this.values[idx] = e.value; | ||
for (var i = this.values.length - 1; 0 <= i; --i) { | ||
if (this.values[i] === this) return; | ||
}var component = this.component; | ||
var rendered = render(component.props, this.values); | ||
if (!R.equals(component.state.rendered, rendered)) component.setState({ rendered: rendered }); | ||
return; | ||
} | ||
case "error": | ||
throw e.value; | ||
default: | ||
{ | ||
this.handlers[idx] = null; | ||
var n = this.handlers.length; | ||
if (n !== this.values.length) return; | ||
for (var _i2 = 0; _i2 < n; ++_i2) { | ||
if (this.handlers[_i2]) return; | ||
}this.component.setState(FromClassEnd); | ||
return; | ||
} | ||
} | ||
}; | ||
// | ||
var FromClassEnd = { renderer: null }; | ||
var FromClassNull = { renderer: null, rendered: null }; | ||
var FromClass = function (_LiftedComponent2) { | ||
@@ -387,16 +251,30 @@ _inherits(FromClass, _LiftedComponent2); | ||
return _possibleConstructorReturn(this, (FromClass.__proto__ || Object.getPrototypeOf(FromClass)).call(this, props)); | ||
var _this4 = _possibleConstructorReturn(this, (FromClass.__proto__ || Object.getPrototypeOf(FromClass)).call(this, props)); | ||
_this4.values = _this4; | ||
_this4.handlers = null; | ||
return _this4; | ||
} | ||
_createClass(FromClass, [{ | ||
key: "theInitialState", | ||
value: function theInitialState() { | ||
return FromClassNull; | ||
} | ||
}, { | ||
key: "doUnsubscribe", | ||
value: function doUnsubscribe() { | ||
var renderer = this.state.renderer; | ||
var _this5 = this; | ||
if (renderer) renderer.unsubscribe(); | ||
var handlers = this.handlers; | ||
if (handlers) { | ||
if (handlers instanceof Function) { | ||
forEach(this.props, function (obs) { | ||
return obs.offAny(handlers); | ||
}); | ||
} else { | ||
(function () { | ||
var i = -1; | ||
forEach(_this5.props, function (obs) { | ||
var handler = handlers[++i]; | ||
if (handler) obs.offAny(handler); | ||
}); | ||
})(); | ||
} | ||
} | ||
} | ||
@@ -406,16 +284,102 @@ }, { | ||
value: function doSubscribe(props) { | ||
var _this6 = this; | ||
var n = 0; | ||
forEach(props, function () { | ||
return n += 1; | ||
return ++n; | ||
}); | ||
switch (n) { | ||
case 1: | ||
new Renderer1(this, props); | ||
break; | ||
if (n === 1) { | ||
(function () { | ||
_this6.values = _this6; | ||
var handlers = function handlers(e) { | ||
return _this6.doHandle1(e); | ||
}; | ||
_this6.handlers = handlers; | ||
forEach(props, function (obs) { | ||
return obs.onAny(handlers); | ||
}); | ||
})(); | ||
} else { | ||
this.values = Array(n).fill(this); | ||
this.handlers = []; | ||
forEach(props, function (obs) { | ||
var handler = function handler(e) { | ||
return _this6.doHandleN(handler, e); | ||
}; | ||
_this6.handlers.push(handler); | ||
obs.onAny(handler); | ||
}); | ||
} | ||
} | ||
}, { | ||
key: "doHandle1", | ||
value: function doHandle1(e) { | ||
switch (e.type) { | ||
case "value": | ||
{ | ||
var value = e.value; | ||
if (this.values !== value) { | ||
this.values = value; | ||
this.forceUpdate(); | ||
} | ||
break; | ||
} | ||
case "error": | ||
throw e.value; | ||
default: | ||
new RendererN(this, props, n); | ||
break; | ||
{ | ||
this.values = [this.values]; | ||
this.handlers = null; | ||
} | ||
} | ||
} | ||
}, { | ||
key: "doHandleN", | ||
value: function doHandleN(handler, e) { | ||
var handlers = this.handlers; | ||
var idx = 0; | ||
while (handlers[idx] !== handler) { | ||
++idx; | ||
}switch (e.type) { | ||
case "value": | ||
{ | ||
var value = e.value; | ||
var values = this.values; | ||
if (values[idx] !== value) { | ||
values[idx] = value; | ||
this.forceUpdate(); | ||
} | ||
break; | ||
} | ||
case "error": | ||
throw e.value; | ||
default: | ||
{ | ||
handlers[idx] = null; | ||
var n = handlers.length; | ||
if (n !== this.values.length) return; | ||
for (var i = 0; i < n; ++i) { | ||
if (handlers[i]) return; | ||
}this.handlers = null; | ||
} | ||
} | ||
} | ||
}, { | ||
key: "render", | ||
value: function render() { | ||
if (this.handlers instanceof Function) { | ||
var value = this.values; | ||
if (value === this) return null; | ||
return _render(this.props, [value]); | ||
} else { | ||
var values = this.values; | ||
for (var i = 0, n = values.length; i < n; ++i) { | ||
if (values[i] === this) return null; | ||
}return _render(this.props, values); | ||
} | ||
} | ||
}]); | ||
@@ -455,3 +419,3 @@ | ||
} else { | ||
return _react2.default.createElement.apply(_react2.default, [type, R.dissoc("karet-lift", props)].concat(children)); | ||
return _react2.default.createElement.apply(_react2.default, [type, dissoc("karet-lift", props)].concat(children)); | ||
} | ||
@@ -465,2 +429,2 @@ } else { | ||
exports.default = client; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9rYXJldC5qcyJdLCJuYW1lcyI6WyJSIiwiTGlmdGVkQ29tcG9uZW50IiwicHJvcHMiLCJzdGF0ZSIsInRoZUluaXRpYWxTdGF0ZSIsIm5leHRQcm9wcyIsImRvVW5zdWJzY3JpYmUiLCJkb1N1YnNjcmliZSIsIm5wIiwibnMiLCJyZW5kZXJlZCIsInNldFN0YXRlIiwiQ29tcG9uZW50IiwiRnJvbUtlZmlyRW5kIiwiY2FsbGJhY2siLCJGcm9tS2VmaXJOdWxsIiwiRnJvbUtlZmlyIiwib2JzZXJ2YWJsZSIsIm9mZkFueSIsImUiLCJ0eXBlIiwidmFsdWUiLCJvbkFueSIsImZyb21LZWZpciIsImNyZWF0ZUVsZW1lbnQiLCJoYXNPYnMiLCJrZXkiLCJ2YWwiLCJrIiwidmFsSyIsImZvckVhY2giLCJmbiIsImNoaWxkcmVuIiwiY29uc3RydWN0b3IiLCJBcnJheSIsImkiLCJsZW5ndGgiLCJlbXB0eSIsInJlbmRlciIsInZhbHVlcyIsIm5ld1Byb3BzIiwibmV3Q2hpbGRyZW4iLCJuIiwidmFsSSIsInJlZiIsInZhbE8iLCJuZXdTdHlsZSIsImoiLCJzdHlsZSIsIkZha2VDb21wb25lbnQiLCJwcm90b3R5cGUiLCJuZXdTdGF0ZSIsInJlbmRlcmVyIiwiUmVuZGVyZXIxIiwiY29tcG9uZW50IiwiaGFuZGxlciIsImRvSGFuZGxlIiwidW5zdWJzY3JpYmUiLCJlcXVhbHMiLCJGcm9tQ2xhc3NFbmQiLCJSZW5kZXJlck4iLCJoYW5kbGVycyIsInB1c2giLCJpZHgiLCJGcm9tQ2xhc3NOdWxsIiwiRnJvbUNsYXNzIiwiaGFzQW55T2JzIiwiZmluZCIsIngiLCJmaWx0ZXJQcm9wcyIsImNsaWVudCIsImRpc3NvYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7SUFBWUEsQzs7QUFDWjs7OztBQUNBOzs7Ozs7Ozs7Ozs7OztBQUVBOztJQUVNQyxlOzs7QUFDSiwyQkFBWUMsS0FBWixFQUFtQjtBQUFBOztBQUFBLGtJQUNYQSxLQURXOztBQUVq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RUFBTjs7a0JBaUJlc0MsTSIsImZpbGUiOiJrYXJldC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFIgICAgICAgZnJvbSBcInJhbWRhXCJcbmltcG9ydCBSZWFjdCAgICAgICAgZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSBcImtlZmlyXCJcblxuLy9cblxuY2xhc3MgTGlmdGVkQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICB0aGlzLnN0YXRlID0gdGhpcy50aGVJbml0aWFsU3RhdGUoKVxuICB9XG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgdGhpcy5kb1Vuc3Vic2NyaWJlKClcbiAgICB0aGlzLmRvU3Vic2NyaWJlKG5leHRQcm9wcylcbiAgfVxuICBjb21wb25lbnRXaWxsTW91bnQoKSB7XG4gICAgdGhpcy5kb1Vuc3Vic2NyaWJlKClcbiAgICB0aGlzLmRvU3Vic2NyaWJlKHRoaXMucHJvcHMpXG4gIH1cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5wLCBucykge1xuICAgIHJldHVybiBucy5yZW5kZXJlZCAhPT0gdGhpcy5zdGF0ZS5yZW5kZXJlZFxuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuZG9VbnN1YnNjcmliZSgpXG4gICAgdGhpcy5zZXRTdGF0ZSh0aGlzLnRoZUluaXRpYWxTdGF0ZSgpKVxuICB9XG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5yZW5kZXJlZFxuICB9XG59XG5cbi8vXG5cbmNvbnN0IEZyb21LZWZpckVuZCA9IHtjYWxsYmFjazogbnVsbH1cbmNvbnN0IEZyb21LZWZpck51bGwgPSB7Y2FsbGJhY2s6IG51bGwsIHJlbmRlcmVkOiBudWxsfVxuXG5jbGFzcyBGcm9tS2VmaXIgZXh0ZW5kcyBMaWZ0ZWRDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuICB9XG4gIHRoZUluaXRpYWxTdGF0ZSgpIHtcbiAgICByZXR1cm4gRnJvbUtlZmlyTnVsbFxuICB9XG4gIGRvVW5zdWJzY3JpYmUoKSB7XG4gICAgY29uc3Qge2NhbGxiYWNrfSA9IHRoaXMuc3RhdGVcbiAgICBpZiAoY2FsbGJhY2spXG4gICAgICB0aGlzLnByb3BzLm9ic2VydmFibGUub2ZmQW55KGNhbGxiYWNrKVxuICB9XG4gIGRvU3Vic2NyaWJlKHtvYnNlcnZhYmxlfSkge1xuICAgIGlmIChvYnNlcnZhYmxlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgY29uc3QgY2FsbGJhY2sgPSBlID0+IHtcbiAgICAgICAgc3dpdGNoIChlLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwidmFsdWVcIjpcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe3JlbmRlcmVkOiBlLnZhbHVlfSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBcImVycm9yXCI6XG4gICAgICAgICAgICB0aHJvdyBlLnZhbHVlXG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShGcm9tS2VmaXJFbmQpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvYnNlcnZhYmxlLm9uQW55KGNhbGxiYWNrKVxuICAgICAgdGhpcy5zZXRTdGF0ZSh7Y2FsbGJhY2t9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtyZW5kZXJlZDogb2JzZXJ2YWJsZX0pXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBmcm9tS2VmaXIgPSBvYnNlcnZhYmxlID0+XG4gIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRnJvbUtlZmlyLCB7b2JzZXJ2YWJsZX0pXG5cbi8vXG5cbmZ1bmN0aW9uIGhhc09icyhwcm9wcykge1xuICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgIGNvbnN0IHZhbCA9IHByb3BzW2tleV1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2UgaWYgKFwic3R5bGVcIiA9PT0ga2V5KSB7XG4gICAgICBmb3IgKGNvbnN0IGsgaW4gdmFsKSB7XG4gICAgICAgIGNvbnN0IHZhbEsgPSB2YWxba11cbiAgICAgICAgaWYgKHZhbEsgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoKHByb3BzLCBmbikge1xuICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgIGNvbnN0IHZhbCA9IHByb3BzW2tleV1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgZm4odmFsKVxuICAgIH0gZWxzZSBpZiAoXCJjaGlsZHJlblwiID09PSBrZXkpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gcHJvcHNba2V5XVxuICAgICAgaWYgKGNoaWxkcmVuLmNvbnN0cnVjdG9yID09PSBBcnJheSkge1xuICAgICAgICBmb3IgKGxldCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSBjaGlsZHJlbltpXVxuICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKVxuICAgICAgICAgICAgZm4odmFsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcInN0eWxlXCIgPT09IGtleSkge1xuICAgICAgZm9yIChjb25zdCBrIGluIHZhbCkge1xuICAgICAgICBjb25zdCB2YWxLID0gdmFsW2tdXG4gICAgICAgIGlmICh2YWxLIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSlcbiAgICAgICAgICBmbih2YWxLKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBlbXB0eSA9IFtdXG5cbmZ1bmN0aW9uIHJlbmRlcihwcm9wcywgdmFsdWVzKSB7XG4gIGxldCB0eXBlXG4gIGxldCBuZXdQcm9wcyA9IG51bGxcbiAgbGV0IG5ld0NoaWxkcmVuXG5cbiAgbGV0IGsgPSAtMVxuXG4gIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgY29uc3QgdmFsID0gcHJvcHNba2V5XVxuICAgIGlmIChcImNoaWxkcmVuXCIgPT09IGtleSkge1xuICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgbmV3Q2hpbGRyZW4gPSBbdmFsdWVzWysra11dXG4gICAgICB9IGVsc2UgaWYgKHZhbC5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHtcbiAgICAgICAgbmV3Q2hpbGRyZW4gPSBBcnJheSh2YWwubGVuZ3RoKVxuICAgICAgICBmb3IgKGxldCBpPTAsIG49dmFsLmxlbmd0aDsgaTxuOyArK2kpIHtcbiAgICAgICAgICBjb25zdCB2YWxJID0gdmFsW2ldXG4gICAgICAgICAgaWYgKHZhbEkgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKVxuICAgICAgICAgICAgbmV3Q2hpbGRyZW5baV0gPSB2YWx1ZXNbKytrXVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIG5ld0NoaWxkcmVuW2ldID0gdmFsSVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgIHtcbiAgICAgICAgbmV3Q2hpbGRyZW4gPSBbdmFsXVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXCIkJHJlZlwiID09PSBrZXkpIHtcbiAgICAgIGlmICghbmV3UHJvcHMpIG5ld1Byb3BzID0ge31cbiAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICAgIG5ld1Byb3BzLnJlZiA9IHZhbHVlc1srK2tdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdQcm9wcy5yZWYgPSB2YWxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgIGNvbnN0IHZhbE8gPSB2YWx1ZXNbKytrXVxuICAgICAgaWYgKCFuZXdQcm9wcykgbmV3UHJvcHMgPSB7fVxuICAgICAgbmV3UHJvcHNba2V5XSA9IHZhbE9cbiAgICB9IGVsc2UgaWYgKFwic3R5bGVcIiA9PT0ga2V5KSB7XG4gICAgICBsZXQgbmV3U3R5bGVcbiAgICAgIGZvciAoY29uc3QgaSBpbiB2YWwpIHtcbiAgICAgICAgY29uc3QgdmFsSSA9IHZhbFtpXVxuICAgICAgICBpZiAodmFsSSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICBpZiAoIW5ld1N0eWxlKSB7XG4gICAgICAgICAgICBuZXdTdHlsZSA9IHt9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGogaW4gdmFsKSB7XG4gICAgICAgICAgICAgIGlmIChqID09PSBpKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIG5ld1N0eWxlW2pdID0gdmFsW2pdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG5ld1N0eWxlW2ldID0gdmFsdWVzWysra11cbiAgICAgICAgfSBlbHNlIGlmIChuZXdTdHlsZSkge1xuICAgICAgICAgIG5ld1N0eWxlW2ldID0gdmFsSVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIW5ld1Byb3BzKSBuZXdQcm9wcyA9IHt9XG4gICAgICBuZXdQcm9wcy5zdHlsZSA9IG5ld1N0eWxlIHx8IHZhbFxuICAgIH0gZWxzZSBpZiAoXCIkJHR5cGVcIiA9PT0ga2V5KSB7XG4gICAgICB0eXBlID0gcHJvcHNba2V5XVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIW5ld1Byb3BzKSBuZXdQcm9wcyA9IHt9XG4gICAgICBuZXdQcm9wc1trZXldID0gdmFsXG4gICAgfVxuICB9XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHR5cGUsIG5ld1Byb3BzLCAuLi4obmV3Q2hpbGRyZW4gfHwgZW1wdHkpKVxufVxuXG4vL1xuXG5mdW5jdGlvbiBGYWtlQ29tcG9uZW50KHN0YXRlLCBwcm9wcykge1xuICB0aGlzLnByb3BzID0gcHJvcHNcbiAgdGhpcy5zdGF0ZSA9IHN0YXRlXG59XG5cbkZha2VDb21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKG5ld1N0YXRlKSB7XG4gIGlmIChcInJlbmRlcmVyXCIgaW4gbmV3U3RhdGUpXG4gICAgdGhpcy5zdGF0ZS5yZW5kZXJlciA9IG5ld1N0YXRlLnJlbmRlcmVyXG4gIGlmIChcInJlbmRlcmVkXCIgaW4gbmV3U3RhdGUpXG4gICAgdGhpcy5zdGF0ZS5yZW5kZXJlZCA9IG5ld1N0YXRlLnJlbmRlcmVkXG59XG5cbi8vXG5cbmZ1bmN0aW9uIFJlbmRlcmVyMShjb21wb25lbnQsIG5ld1Byb3BzKSB7XG4gIGNvbnN0IHN0YXRlID0ge3JlbmRlcmVyOiB0aGlzLCByZW5kZXJlZDogY29tcG9uZW50LnN0YXRlLnJlbmRlcmVkfVxuICB0aGlzLmNvbXBvbmVudCA9IG5ldyBGYWtlQ29tcG9uZW50KHN0YXRlLCBuZXdQcm9wcylcbiAgdGhpcy5oYW5kbGVyID0gZSA9PiB0aGlzLmRvSGFuZGxlKGUpXG4gIGZvckVhY2gobmV3UHJvcHMsIG9ic2VydmFibGUgPT4gb2JzZXJ2YWJsZS5vbkFueSh0aGlzLmhhbmRsZXIpKVxuICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudFxuICBjb21wb25lbnQuc2V0U3RhdGUoc3RhdGUpXG59XG5cblJlbmRlcmVyMS5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJcbiAgaWYgKGhhbmRsZXIpXG4gICAgZm9yRWFjaCh0aGlzLmNvbXBvbmVudC5wcm9wcywgb2JzZXJ2YWJsZSA9PiBvYnNlcnZhYmxlLm9mZkFueShoYW5kbGVyKSlcbn1cblxuUmVuZGVyZXIxLnByb3RvdHlwZS5kb0hhbmRsZSA9IGZ1bmN0aW9uIChlKSB7XG4gIHN3aXRjaCAoZS50eXBlKSB7XG4gICAgY2FzZSBcInZhbHVlXCI6IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50XG4gICAgICBjb25zdCByZW5kZXJlZCA9IHJlbmRlcihjb21wb25lbnQucHJvcHMsIFtlLnZhbHVlXSlcbiAgICAgIGlmICghUi5lcXVhbHMoY29tcG9uZW50LnN0YXRlLnJlbmRlcmVkLCByZW5kZXJlZCkpXG4gICAgICAgIGNvbXBvbmVudC5zZXRTdGF0ZSh7cmVuZGVyZWR9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhc2UgXCJlcnJvclwiOlxuICAgICAgdGhyb3cgZS52YWx1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLmhhbmRsZXIgPSBudWxsXG4gICAgICB0aGlzLmNvbXBvbmVudC5zZXRTdGF0ZShGcm9tQ2xhc3NFbmQpXG4gICAgICByZXR1cm5cbiAgfVxufVxuXG4vL1xuXG5mdW5jdGlvbiBSZW5kZXJlck4oY29tcG9uZW50LCBuZXdQcm9wcywgbikge1xuICBjb25zdCBzdGF0ZSA9IHtyZW5kZXJlcjogdGhpcywgcmVuZGVyZWQ6IGNvbXBvbmVudC5zdGF0ZS5yZW5kZXJlZH1cbiAgdGhpcy5jb21wb25lbnQgPSBuZXcgRmFrZUNvbXBvbmVudChzdGF0ZSwgbmV3UHJvcHMpXG4gIHRoaXMuaGFuZGxlcnMgPSBbXVxuICB0aGlzLnZhbHVlcyA9IEFycmF5KG4pXG5cbiAgZm9yIChsZXQgaT0wOyBpPG47ICsraSlcbiAgICB0aGlzLnZhbHVlc1tpXSA9IHRoaXNcblxuICBmb3JFYWNoKG5ld1Byb3BzLCBvYnNlcnZhYmxlID0+IHtcbiAgICBjb25zdCBpID0gdGhpcy5oYW5kbGVycy5sZW5ndGhcbiAgICBjb25zdCBoYW5kbGVyID0gZSA9PiB0aGlzLmRvSGFuZGxlKGksIGUpXG4gICAgdGhpcy5oYW5kbGVycy5wdXNoKGhhbmRsZXIpXG4gICAgb2JzZXJ2YWJsZS5vbkFueShoYW5kbGVyKVxuICB9KVxuXG4gIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50XG4gIGNvbXBvbmVudC5zZXRTdGF0ZShzdGF0ZSlcbn1cblxuUmVuZGVyZXJOLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgbGV0IGkgPSAtMVxuICBmb3JFYWNoKHRoaXMuY29tcG9uZW50LnByb3BzLCBvYnNlcnZhYmxlID0+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVyc1srK2ldXG4gICAgaWYgKGhhbmRsZXIpXG4gICAgICBvYnNlcnZhYmxlLm9mZkFueShoYW5kbGVyKVxuICB9KVxufVxuXG5SZW5kZXJlck4ucHJvdG90eXBlLmRvSGFuZGxlID0gZnVuY3Rpb24gKGlkeCwgZSkge1xuICBzd2l0Y2ggKGUudHlwZSkge1xuICAgIGNhc2UgXCJ2YWx1ZVwiOiB7XG4gICAgICB0aGlzLnZhbHVlc1tpZHhdID0gZS52YWx1ZVxuXG4gICAgICBmb3IgKGxldCBpPXRoaXMudmFsdWVzLmxlbmd0aC0xOyAwIDw9IGk7IC0taSlcbiAgICAgICAgaWYgKHRoaXMudmFsdWVzW2ldID09PSB0aGlzKVxuICAgICAgICAgIHJldHVyblxuXG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudFxuICAgICAgY29uc3QgcmVuZGVyZWQgPSByZW5kZXIoY29tcG9uZW50LnByb3BzLCB0aGlzLnZhbHVlcylcbiAgICAgIGlmICghUi5lcXVhbHMoY29tcG9uZW50LnN0YXRlLnJlbmRlcmVkLCByZW5kZXJlZCkpXG4gICAgICAgIGNvbXBvbmVudC5zZXRTdGF0ZSh7cmVuZGVyZWR9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhc2UgXCJlcnJvclwiOlxuICAgICAgdGhyb3cgZS52YWx1ZVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRoaXMuaGFuZGxlcnNbaWR4XSA9IG51bGxcblxuICAgICAgY29uc3QgbiA9IHRoaXMuaGFuZGxlcnMubGVuZ3RoXG5cbiAgICAgIGlmIChuICE9PSB0aGlzLnZhbHVlcy5sZW5ndGgpXG4gICAgICAgIHJldHVyblxuXG4gICAgICBmb3IgKGxldCBpPTA7IGkgPCBuOyArK2kpXG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXJzW2ldKVxuICAgICAgICAgIHJldHVyblxuXG4gICAgICB0aGlzLmNvbXBvbmVudC5zZXRTdGF0ZShGcm9tQ2xhc3NFbmQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cbn1cblxuLy9cblxuY29uc3QgRnJvbUNsYXNzRW5kID0ge3JlbmRlcmVyOiBudWxsfVxuY29uc3QgRnJvbUNsYXNzTnVsbCA9IHtyZW5kZXJlcjogbnVsbCwgcmVuZGVyZWQ6IG51bGx9XG5cbmNsYXNzIEZyb21DbGFzcyBleHRlbmRzIExpZnRlZENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG4gIH1cbiAgdGhlSW5pdGlhbFN0YXRlKCkge1xuICAgIHJldHVybiBGcm9tQ2xhc3NOdWxsXG4gIH1cbiAgZG9VbnN1YnNjcmliZSgpIHtcbiAgICBjb25zdCB7cmVuZGVyZXJ9ID0gdGhpcy5zdGF0ZVxuICAgIGlmIChyZW5kZXJlcilcbiAgICAgIHJlbmRlcmVyLnVuc3Vic2NyaWJlKClcbiAgfVxuICBkb1N1YnNjcmliZShwcm9wcykge1xuICAgIGxldCBuID0gMFxuICAgIGZvckVhY2gocHJvcHMsICgpID0+IG4gKz0gMSlcblxuICAgIHN3aXRjaCAobikge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBuZXcgUmVuZGVyZXIxKHRoaXMsIHByb3BzKVxuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbmV3IFJlbmRlcmVyTih0aGlzLCBwcm9wcywgbilcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbn1cblxuLy9cblxuY29uc3QgaGFzQW55T2JzID0gKHByb3BzLCBjaGlsZHJlbikgPT5cbiAgY2hpbGRyZW4uZmluZCh4ID0+IHggaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB8fCBwcm9wcyAmJiBoYXNPYnMocHJvcHMpXG5cbmNvbnN0IGZpbHRlclByb3BzID0gKHR5cGUsIHByb3BzKSA9PiB7XG4gIGNvbnN0IG5ld1Byb3BzID0ge1wiJCR0eXBlXCI6IHR5cGV9XG4gIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgY29uc3QgdmFsID0gcHJvcHNba2V5XVxuICAgIGlmIChcInJlZlwiID09PSBrZXkpXG4gICAgICBuZXdQcm9wc1tcIiQkcmVmXCJdID0gdmFsXG4gICAgZWxzZSBpZiAoXCJrYXJldC1saWZ0XCIgIT09IGtleSlcbiAgICAgIG5ld1Byb3BzW2tleV0gPSB2YWxcbiAgfVxuICByZXR1cm4gbmV3UHJvcHNcbn1cblxuY29uc3QgY2xpZW50ID0ge1xuICAuLi5SZWFjdCxcbiAgY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgLi4uY2hpbGRyZW4pIHtcbiAgICBpZiAodHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIgJiYgaGFzQW55T2JzKHByb3BzLCBjaGlsZHJlbikpIHtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEZyb21DbGFzcywgZmlsdGVyUHJvcHModHlwZSwgcHJvcHMpLCAuLi5jaGlsZHJlbilcbiAgICB9IGVsc2UgaWYgKHByb3BzICYmIHByb3BzW1wia2FyZXQtbGlmdFwiXSA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKGhhc0FueU9icyhwcm9wcywgY2hpbGRyZW4pKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEZyb21DbGFzcywgZmlsdGVyUHJvcHModHlwZSwgcHJvcHMpLCAuLi5jaGlsZHJlbilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHR5cGUsIFIuZGlzc29jKFwia2FyZXQtbGlmdFwiLCBwcm9wcyksIC4uLmNoaWxkcmVuKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgLi4uY2hpbGRyZW4pXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsaWVudFxuIl19 | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9rYXJldC5qcyJdLCJuYW1lcyI6WyJlbXB0eUFycmF5IiwiZGlzc29jIiwiayIsIm8iLCJyIiwiT2JqZWN0IiwiYXNzaWduIiwiTGlmdGVkQ29tcG9uZW50IiwicHJvcHMiLCJuZXh0UHJvcHMiLCJkb1Vuc3Vic2NyaWJlIiwiZG9TdWJzY3JpYmUiLCJDb21wb25lbnQiLCJGcm9tS2VmaXIiLCJjYWxsYmFjayIsInJlbmRlcmVkIiwib2JzZXJ2YWJsZSIsIm9mZkFueSIsImUiLCJ0eXBlIiwidmFsdWUiLCJmb3JjZVVwZGF0ZSIsIm9uQW55IiwiZnJvbUtlZmlyIiwiY3JlYXRlRWxlbWVudCIsImhhc09icyIsImtleSIsInZhbCIsInZhbEsiLCJmb3JFYWNoIiwiZm4iLCJjaGlsZHJlbiIsImNvbnN0cnVjdG9yIiwiQXJyYXkiLCJpIiwibGVuZ3RoIiwicmVuZGVyIiwidmFsdWVzIiwibmV3UHJvcHMiLCJuZXdDaGlsZHJlbiIsIm4iLCJ2YWxJIiwicmVmIiwidmFsTyIsIm5ld1N0eWxlIiwiaiIsInN0eWxlIiwiRnJvbUNsYXNzIiwiaGFuZGxlcnMiLCJGdW5jdGlvbiIsIm9icyIsImhhbmRsZXIiLCJkb0hhbmRsZTEiLCJmaWxsIiwiZG9IYW5kbGVOIiwicHVzaCIsImlkeCIsImhhc0FueU9icyIsImZpbmQiLCJ4IiwiZmlsdGVyUHJvcHMiLCJjbGllbnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7Ozs7Ozs7Ozs7O0FBRUE7O0FBRUEsSUFBTUEsYUFBYSxFQUFuQjs7QUFFQSxJQUFNQyxTQUFTLFNBQVRBLE1BQVMsQ0FBQ0MsQ0FBRCxFQUFJQyxDQUFKLEVBQVU7QUFDdkIsTUFBTUMsSUFBSUMsT0FBT0MsTUFBUCxDQUFjLEVBQWQsRUFBa0JILENBQWxCLENBQVY7QUFDQSxTQUFPQyxFQUFFRixDQUFGLENBQVA7QUFDQSxTQUFPRSxDQUFQO0FBQ0QsQ0FKRDs7QUFNQTs7SUFFTUcsZTs7O0FBQ0osMkJBQVlDLEtB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b0J1QixTQUFwQixFQUErQmEsWUFBWXpDLElBQVosRUFBa0JYLEtBQWxCLENBQS9CLFNBQTREdUIsUUFBNUQsRUFBUDtBQUNELE9BRkQsTUFFTztBQUNMLGVBQU8sZ0JBQU1QLGFBQU4seUJBQW9CTCxJQUFwQixFQUEwQmxCLE9BQU8sWUFBUCxFQUFxQk8sS0FBckIsQ0FBMUIsU0FBMER1QixRQUExRCxFQUFQO0FBQ0Q7QUFDRixLQU5NLE1BTUE7QUFDTCxhQUFPLGdCQUFNUCxhQUFOLHlCQUFvQkwsSUFBcEIsRUFBMEJYLEtBQTFCLFNBQW9DdUIsUUFBcEMsRUFBUDtBQUNEO0FBQ0Y7QUFkRyxFQUFOOztrQkFpQmU4QixNIiwiZmlsZSI6ImthcmV0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0ICAgICAgICBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwia2VmaXJcIlxuXG4vL1xuXG5jb25zdCBlbXB0eUFycmF5ID0gW11cblxuY29uc3QgZGlzc29jID0gKGssIG8pID0+IHtcbiAgY29uc3QgciA9IE9iamVjdC5hc3NpZ24oe30sIG8pXG4gIGRlbGV0ZSByW2tdXG4gIHJldHVybiByXG59XG5cbi8vXG5cbmNsYXNzIExpZnRlZENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG4gIH1cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICB0aGlzLmRvVW5zdWJzY3JpYmUoKVxuICAgIHRoaXMuZG9TdWJzY3JpYmUobmV4dFByb3BzKVxuICB9XG4gIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICB0aGlzLmRvU3Vic2NyaWJlKHRoaXMucHJvcHMpXG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5kb1Vuc3Vic2NyaWJlKClcbiAgfVxufVxuXG4vL1xuXG5jbGFzcyBGcm9tS2VmaXIgZXh0ZW5kcyBMaWZ0ZWRDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsXG4gICAgdGhpcy5yZW5kZXJlZCA9IG51bGxcbiAgfVxuICBkb1Vuc3Vic2NyaWJlKCkge1xuICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5jYWxsYmFja1xuICAgIGlmIChjYWxsYmFjaylcbiAgICAgIHRoaXMucHJvcHMub2JzZXJ2YWJsZS5vZmZBbnkoY2FsbGJhY2spXG4gIH1cbiAgZG9TdWJzY3JpYmUoe29ic2VydmFibGV9KSB7XG4gICAgaWYgKG9ic2VydmFibGUgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IGUgPT4ge1xuICAgICAgICBzd2l0Y2ggKGUudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJ2YWx1ZVwiOlxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZCA9IGUudmFsdWVcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIFwiZXJyb3JcIjpcbiAgICAgICAgICAgIHRocm93IGUudmFsdWVcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICAgIG9ic2VydmFibGUub25BbnkoY2FsbGJhY2spXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyZWQgPSBvYnNlcnZhYmxlXG4gICAgfVxuICB9XG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlZFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBmcm9tS2VmaXIgPSBvYnNlcnZhYmxlID0+XG4gIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRnJvbUtlZmlyLCB7b2JzZXJ2YWJsZX0pXG5cbi8vXG5cbmZ1bmN0aW9uIGhhc09icyhwcm9wcykge1xuICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgIGNvbnN0IHZhbCA9IHByb3BzW2tleV1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2UgaWYgKFwic3R5bGVcIiA9PT0ga2V5KSB7XG4gICAgICBmb3IgKGNvbnN0IGsgaW4gdmFsKSB7XG4gICAgICAgIGNvbnN0IHZhbEsgPSB2YWxba11cbiAgICAgICAgaWYgKHZhbEsgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoKHByb3BzLCBmbikge1xuICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgIGNvbnN0IHZhbCA9IHByb3BzW2tleV1cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgZm4odmFsKVxuICAgIH0gZWxzZSBpZiAoXCJjaGlsZHJlblwiID09PSBrZXkpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gcHJvcHNba2V5XVxuICAgICAgaWYgKGNoaWxkcmVuLmNvbnN0cnVjdG9yID09PSBBcnJheSkge1xuICAgICAgICBmb3IgKGxldCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSBjaGlsZHJlbltpXVxuICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKVxuICAgICAgICAgICAgZm4odmFsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcInN0eWxlXCIgPT09IGtleSkge1xuICAgICAgZm9yIChjb25zdCBrIGluIHZhbCkge1xuICAgICAgICBjb25zdCB2YWxLID0gdmFsW2tdXG4gICAgICAgIGlmICh2YWxLIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSlcbiAgICAgICAgICBmbih2YWxLKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZW5kZXIocHJvcHMsIHZhbHVlcykge1xuICBsZXQgdHlwZVxuICBsZXQgbmV3UHJvcHMgPSBudWxsXG4gIGxldCBuZXdDaGlsZHJlblxuXG4gIGxldCBrID0gLTFcblxuICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgIGNvbnN0IHZhbCA9IHByb3BzW2tleV1cbiAgICBpZiAoXCJjaGlsZHJlblwiID09PSBrZXkpIHtcbiAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICAgIG5ld0NoaWxkcmVuID0gW3ZhbHVlc1srK2tdXVxuICAgICAgfSBlbHNlIGlmICh2YWwuY29uc3RydWN0b3IgPT09IEFycmF5KSB7XG4gICAgICAgIG5ld0NoaWxkcmVuID0gQXJyYXkodmFsLmxlbmd0aClcbiAgICAgICAgZm9yIChsZXQgaT0wLCBuPXZhbC5sZW5ndGg7IGk8bjsgKytpKSB7XG4gICAgICAgICAgY29uc3QgdmFsSSA9IHZhbFtpXVxuICAgICAgICAgIGlmICh2YWxJIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSlcbiAgICAgICAgICAgIG5ld0NoaWxkcmVuW2ldID0gdmFsdWVzWysra11cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBuZXdDaGlsZHJlbltpXSA9IHZhbElcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3Q2hpbGRyZW4gPSBbdmFsXVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXCIkJHJlZlwiID09PSBrZXkpIHtcbiAgICAgIGlmICghbmV3UHJvcHMpIG5ld1Byb3BzID0ge31cbiAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICAgIG5ld1Byb3BzLnJlZiA9IHZhbHVlc1srK2tdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdQcm9wcy5yZWYgPSB2YWxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgIGNvbnN0IHZhbE8gPSB2YWx1ZXNbKytrXVxuICAgICAgaWYgKCFuZXdQcm9wcykgbmV3UHJvcHMgPSB7fVxuICAgICAgbmV3UHJvcHNba2V5XSA9IHZhbE9cbiAgICB9IGVsc2UgaWYgKFwic3R5bGVcIiA9PT0ga2V5KSB7XG4gICAgICBsZXQgbmV3U3R5bGVcbiAgICAgIGZvciAoY29uc3QgaSBpbiB2YWwpIHtcbiAgICAgICAgY29uc3QgdmFsSSA9IHZhbFtpXVxuICAgICAgICBpZiAodmFsSSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICBpZiAoIW5ld1N0eWxlKSB7XG4gICAgICAgICAgICBuZXdTdHlsZSA9IHt9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGogaW4gdmFsKSB7XG4gICAgICAgICAgICAgIGlmIChqID09PSBpKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIG5ld1N0eWxlW2pdID0gdmFsW2pdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG5ld1N0eWxlW2ldID0gdmFsdWVzWysra11cbiAgICAgICAgfSBlbHNlIGlmIChuZXdTdHlsZSkge1xuICAgICAgICAgIG5ld1N0eWxlW2ldID0gdmFsSVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIW5ld1Byb3BzKSBuZXdQcm9wcyA9IHt9XG4gICAgICBuZXdQcm9wcy5zdHlsZSA9IG5ld1N0eWxlIHx8IHZhbFxuICAgIH0gZWxzZSBpZiAoXCIkJHR5cGVcIiA9PT0ga2V5KSB7XG4gICAgICB0eXBlID0gcHJvcHNba2V5XVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIW5ld1Byb3BzKSBuZXdQcm9wcyA9IHt9XG4gICAgICBuZXdQcm9wc1trZXldID0gdmFsXG4gICAgfVxuICB9XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHR5cGUsIG5ld1Byb3BzLCAuLi4obmV3Q2hpbGRyZW4gfHwgZW1wdHlBcnJheSkpXG59XG5cbi8vXG5cbmNsYXNzIEZyb21DbGFzcyBleHRlbmRzIExpZnRlZENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG4gICAgdGhpcy52YWx1ZXMgPSB0aGlzXG4gICAgdGhpcy5oYW5kbGVycyA9IG51bGxcbiAgfVxuICBkb1Vuc3Vic2NyaWJlKCkge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVyc1xuICAgIGlmIChoYW5kbGVycykge1xuICAgICAgaWYgKGhhbmRsZXJzIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgZm9yRWFjaCh0aGlzLnByb3BzLCBvYnMgPT4gb2JzLm9mZkFueShoYW5kbGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgaSA9IC0xXG4gICAgICAgIGZvckVhY2godGhpcy5wcm9wcywgb2JzID0+IHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnNbKytpXVxuICAgICAgICAgIGlmIChoYW5kbGVyKVxuICAgICAgICAgICAgb2JzLm9mZkFueShoYW5kbGVyKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBkb1N1YnNjcmliZShwcm9wcykge1xuICAgIGxldCBuID0gMFxuICAgIGZvckVhY2gocHJvcHMsICgpID0+ICsrbilcblxuICAgIGlmIChuID09PSAxKSB7XG4gICAgICB0aGlzLnZhbHVlcyA9IHRoaXNcbiAgICAgIGNvbnN0IGhhbmRsZXJzID0gZSA9PiB0aGlzLmRvSGFuZGxlMShlKVxuICAgICAgdGhpcy5oYW5kbGVycyA9IGhhbmRsZXJzXG4gICAgICBmb3JFYWNoKHByb3BzLCBvYnMgPT4gb2JzLm9uQW55KGhhbmRsZXJzKSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZXMgPSBBcnJheShuKS5maWxsKHRoaXMpXG4gICAgICB0aGlzLmhhbmRsZXJzID0gW11cbiAgICAgIGZvckVhY2gocHJvcHMsIG9icyA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBlID0+IHRoaXMuZG9IYW5kbGVOKGhhbmRsZXIsIGUpXG4gICAgICAgIHRoaXMuaGFuZGxlcnMucHVzaChoYW5kbGVyKVxuICAgICAgICBvYnMub25BbnkoaGFuZGxlcilcbiAgICAgIH0pXG4gICAgfVxuICB9XG4gIGRvSGFuZGxlMShlKSB7XG4gICAgc3dpdGNoIChlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJ2YWx1ZVwiOiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZS52YWx1ZVxuICAgICAgICBpZiAodGhpcy52YWx1ZXMgIT09IHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZVxuICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIFwiZXJyb3JcIjogdGhyb3cgZS52YWx1ZVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aGlzLnZhbHVlcyA9IFt0aGlzLnZhbHVlc11cbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IG51bGxcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZG9IYW5kbGVOKGhhbmRsZXIsIGUpIHtcbiAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnNcbiAgICBsZXQgaWR4PTBcbiAgICB3aGlsZSAoaGFuZGxlcnNbaWR4XSAhPT0gaGFuZGxlcilcbiAgICAgICsraWR4XG4gICAgc3dpdGNoIChlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJ2YWx1ZVwiOiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZS52YWx1ZVxuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnZhbHVlc1xuICAgICAgICBpZiAodmFsdWVzW2lkeF0gIT09IHZhbHVlKSB7XG4gICAgICAgICAgdmFsdWVzW2lkeF0gPSB2YWx1ZVxuICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIFwiZXJyb3JcIjogdGhyb3cgZS52YWx1ZVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBoYW5kbGVyc1tpZHhdID0gbnVsbFxuXG4gICAgICAgIGNvbnN0IG4gPSBoYW5kbGVycy5sZW5ndGhcblxuICAgICAgICBpZiAobiAhPT0gdGhpcy52YWx1ZXMubGVuZ3RoKVxuICAgICAgICAgIHJldHVyblxuXG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG47ICsraSlcbiAgICAgICAgICBpZiAoaGFuZGxlcnNbaV0pXG4gICAgICAgICAgICByZXR1cm5cblxuICAgICAgICB0aGlzLmhhbmRsZXJzID0gbnVsbFxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnMgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlc1xuICAgICAgaWYgKHZhbHVlID09PSB0aGlzKVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgcmV0dXJuIHJlbmRlcih0aGlzLnByb3BzLCBbdmFsdWVdKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnZhbHVlc1xuICAgICAgZm9yIChsZXQgaT0wLCBuPXZhbHVlcy5sZW5ndGg7IGk8bjsgKytpKVxuICAgICAgICBpZiAodmFsdWVzW2ldID09PSB0aGlzKVxuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICByZXR1cm4gcmVuZGVyKHRoaXMucHJvcHMsIHZhbHVlcylcbiAgICB9XG4gIH1cbn1cblxuLy9cblxuY29uc3QgaGFzQW55T2JzID0gKHByb3BzLCBjaGlsZHJlbikgPT5cbiAgY2hpbGRyZW4uZmluZCh4ID0+IHggaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB8fCBwcm9wcyAmJiBoYXNPYnMocHJvcHMpXG5cbmNvbnN0IGZpbHRlclByb3BzID0gKHR5cGUsIHByb3BzKSA9PiB7XG4gIGNvbnN0IG5ld1Byb3BzID0ge1wiJCR0eXBlXCI6IHR5cGV9XG4gIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgY29uc3QgdmFsID0gcHJvcHNba2V5XVxuICAgIGlmIChcInJlZlwiID09PSBrZXkpXG4gICAgICBuZXdQcm9wc1tcIiQkcmVmXCJdID0gdmFsXG4gICAgZWxzZSBpZiAoXCJrYXJldC1saWZ0XCIgIT09IGtleSlcbiAgICAgIG5ld1Byb3BzW2tleV0gPSB2YWxcbiAgfVxuICByZXR1cm4gbmV3UHJvcHNcbn1cblxuY29uc3QgY2xpZW50ID0ge1xuICAuLi5SZWFjdCxcbiAgY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgLi4uY2hpbGRyZW4pIHtcbiAgICBpZiAodHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIgJiYgaGFzQW55T2JzKHByb3BzLCBjaGlsZHJlbikpIHtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEZyb21DbGFzcywgZmlsdGVyUHJvcHModHlwZSwgcHJvcHMpLCAuLi5jaGlsZHJlbilcbiAgICB9IGVsc2UgaWYgKHByb3BzICYmIHByb3BzW1wia2FyZXQtbGlmdFwiXSA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKGhhc0FueU9icyhwcm9wcywgY2hpbGRyZW4pKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEZyb21DbGFzcywgZmlsdGVyUHJvcHModHlwZSwgcHJvcHMpLCAuLi5jaGlsZHJlbilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHR5cGUsIGRpc3NvYyhcImthcmV0LWxpZnRcIiwgcHJvcHMpLCAuLi5jaGlsZHJlbilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIC4uLmNoaWxkcmVuKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGllbnRcbiJdfQ== |
{ | ||
"name": "karet", | ||
"version": "0.1.4", | ||
"version": "0.2.0", | ||
"description": "JSX with Kefir, healthy?", | ||
@@ -45,5 +45,4 @@ "main": "lib/karet.js", | ||
"kefir": "^3.2.1", | ||
"ramda": ">=0.20.1 <0.23.0", | ||
"react": "^15.0.1" | ||
} | ||
} |
271
src/karet.js
@@ -1,2 +0,1 @@ | ||
import * as R from "ramda" | ||
import React from "react" | ||
@@ -7,6 +6,15 @@ import {Observable} from "kefir" | ||
const emptyArray = [] | ||
const dissoc = (k, o) => { | ||
const r = Object.assign({}, o) | ||
delete r[k] | ||
return r | ||
} | ||
// | ||
class LiftedComponent extends React.Component { | ||
constructor(props) { | ||
super(props) | ||
this.state = this.theInitialState() | ||
} | ||
@@ -18,15 +26,7 @@ componentWillReceiveProps(nextProps) { | ||
componentWillMount() { | ||
this.doUnsubscribe() | ||
this.doSubscribe(this.props) | ||
} | ||
shouldComponentUpdate(np, ns) { | ||
return ns.rendered !== this.state.rendered | ||
} | ||
componentWillUnmount() { | ||
this.doUnsubscribe() | ||
this.setState(this.theInitialState()) | ||
} | ||
render() { | ||
return this.state.rendered | ||
} | ||
} | ||
@@ -36,14 +36,10 @@ | ||
const FromKefirEnd = {callback: null} | ||
const FromKefirNull = {callback: null, rendered: null} | ||
class FromKefir extends LiftedComponent { | ||
constructor(props) { | ||
super(props) | ||
this.callback = null | ||
this.rendered = null | ||
} | ||
theInitialState() { | ||
return FromKefirNull | ||
} | ||
doUnsubscribe() { | ||
const {callback} = this.state | ||
const callback = this.callback | ||
if (callback) | ||
@@ -57,3 +53,4 @@ this.props.observable.offAny(callback) | ||
case "value": | ||
this.setState({rendered: e.value}) | ||
this.rendered = e.value | ||
this.forceUpdate() | ||
break | ||
@@ -63,12 +60,14 @@ case "error": | ||
case "end": | ||
this.setState(FromKefirEnd) | ||
break | ||
this.callback = null | ||
} | ||
} | ||
this.callback = callback | ||
observable.onAny(callback) | ||
this.setState({callback}) | ||
} else { | ||
this.setState({rendered: observable}) | ||
this.rendered = observable | ||
} | ||
} | ||
render() { | ||
return this.rendered | ||
} | ||
} | ||
@@ -121,4 +120,2 @@ | ||
const empty = [] | ||
function render(props, values) { | ||
@@ -145,3 +142,3 @@ let type | ||
} | ||
} else { | ||
} else { | ||
newChildren = [val] | ||
@@ -187,3 +184,3 @@ } | ||
} | ||
return React.createElement(type, newProps, ...(newChildren || empty)) | ||
return React.createElement(type, newProps, ...(newChildren || emptyArray)) | ||
} | ||
@@ -193,145 +190,105 @@ | ||
function FakeComponent(state, props) { | ||
this.props = props | ||
this.state = state | ||
} | ||
FakeComponent.prototype.setState = function (newState) { | ||
if ("renderer" in newState) | ||
this.state.renderer = newState.renderer | ||
if ("rendered" in newState) | ||
this.state.rendered = newState.rendered | ||
} | ||
// | ||
function Renderer1(component, newProps) { | ||
const state = {renderer: this, rendered: component.state.rendered} | ||
this.component = new FakeComponent(state, newProps) | ||
this.handler = e => this.doHandle(e) | ||
forEach(newProps, observable => observable.onAny(this.handler)) | ||
this.component = component | ||
component.setState(state) | ||
} | ||
Renderer1.prototype.unsubscribe = function () { | ||
const handler = this.handler | ||
if (handler) | ||
forEach(this.component.props, observable => observable.offAny(handler)) | ||
} | ||
Renderer1.prototype.doHandle = function (e) { | ||
switch (e.type) { | ||
case "value": { | ||
const component = this.component | ||
const rendered = render(component.props, [e.value]) | ||
if (!R.equals(component.state.rendered, rendered)) | ||
component.setState({rendered}) | ||
return | ||
} | ||
case "error": | ||
throw e.value | ||
default: | ||
this.handler = null | ||
this.component.setState(FromClassEnd) | ||
return | ||
} | ||
} | ||
// | ||
function RendererN(component, newProps, n) { | ||
const state = {renderer: this, rendered: component.state.rendered} | ||
this.component = new FakeComponent(state, newProps) | ||
this.handlers = [] | ||
this.values = Array(n) | ||
for (let i=0; i<n; ++i) | ||
this.values[i] = this | ||
forEach(newProps, observable => { | ||
const i = this.handlers.length | ||
const handler = e => this.doHandle(i, e) | ||
this.handlers.push(handler) | ||
observable.onAny(handler) | ||
}) | ||
this.component = component | ||
component.setState(state) | ||
} | ||
RendererN.prototype.unsubscribe = function () { | ||
let i = -1 | ||
forEach(this.component.props, observable => { | ||
const handler = this.handlers[++i] | ||
if (handler) | ||
observable.offAny(handler) | ||
}) | ||
} | ||
RendererN.prototype.doHandle = function (idx, e) { | ||
switch (e.type) { | ||
case "value": { | ||
this.values[idx] = e.value | ||
for (let i=this.values.length-1; 0 <= i; --i) | ||
if (this.values[i] === this) | ||
return | ||
const component = this.component | ||
const rendered = render(component.props, this.values) | ||
if (!R.equals(component.state.rendered, rendered)) | ||
component.setState({rendered}) | ||
return | ||
} | ||
case "error": | ||
throw e.value | ||
default: { | ||
this.handlers[idx] = null | ||
const n = this.handlers.length | ||
if (n !== this.values.length) | ||
return | ||
for (let i=0; i < n; ++i) | ||
if (this.handlers[i]) | ||
return | ||
this.component.setState(FromClassEnd) | ||
return | ||
} | ||
} | ||
} | ||
// | ||
const FromClassEnd = {renderer: null} | ||
const FromClassNull = {renderer: null, rendered: null} | ||
class FromClass extends LiftedComponent { | ||
constructor(props) { | ||
super(props) | ||
this.values = this | ||
this.handlers = null | ||
} | ||
theInitialState() { | ||
return FromClassNull | ||
} | ||
doUnsubscribe() { | ||
const {renderer} = this.state | ||
if (renderer) | ||
renderer.unsubscribe() | ||
const handlers = this.handlers | ||
if (handlers) { | ||
if (handlers instanceof Function) { | ||
forEach(this.props, obs => obs.offAny(handlers)) | ||
} else { | ||
let i = -1 | ||
forEach(this.props, obs => { | ||
const handler = handlers[++i] | ||
if (handler) | ||
obs.offAny(handler) | ||
}) | ||
} | ||
} | ||
} | ||
doSubscribe(props) { | ||
let n = 0 | ||
forEach(props, () => n += 1) | ||
forEach(props, () => ++n) | ||
switch (n) { | ||
case 1: | ||
new Renderer1(this, props) | ||
if (n === 1) { | ||
this.values = this | ||
const handlers = e => this.doHandle1(e) | ||
this.handlers = handlers | ||
forEach(props, obs => obs.onAny(handlers)) | ||
} else { | ||
this.values = Array(n).fill(this) | ||
this.handlers = [] | ||
forEach(props, obs => { | ||
const handler = e => this.doHandleN(handler, e) | ||
this.handlers.push(handler) | ||
obs.onAny(handler) | ||
}) | ||
} | ||
} | ||
doHandle1(e) { | ||
switch (e.type) { | ||
case "value": { | ||
const value = e.value | ||
if (this.values !== value) { | ||
this.values = value | ||
this.forceUpdate() | ||
} | ||
break | ||
default: | ||
new RendererN(this, props, n) | ||
} | ||
case "error": throw e.value | ||
default: { | ||
this.values = [this.values] | ||
this.handlers = null | ||
} | ||
} | ||
} | ||
doHandleN(handler, e) { | ||
const handlers = this.handlers | ||
let idx=0 | ||
while (handlers[idx] !== handler) | ||
++idx | ||
switch (e.type) { | ||
case "value": { | ||
const value = e.value | ||
const values = this.values | ||
if (values[idx] !== value) { | ||
values[idx] = value | ||
this.forceUpdate() | ||
} | ||
break | ||
} | ||
case "error": throw e.value | ||
default: { | ||
handlers[idx] = null | ||
const n = handlers.length | ||
if (n !== this.values.length) | ||
return | ||
for (let i=0; i < n; ++i) | ||
if (handlers[i]) | ||
return | ||
this.handlers = null | ||
} | ||
} | ||
} | ||
render() { | ||
if (this.handlers instanceof Function) { | ||
const value = this.values | ||
if (value === this) | ||
return null | ||
return render(this.props, [value]) | ||
} else { | ||
const values = this.values | ||
for (let i=0, n=values.length; i<n; ++i) | ||
if (values[i] === this) | ||
return null | ||
return render(this.props, values) | ||
} | ||
} | ||
} | ||
@@ -365,3 +322,3 @@ | ||
} else { | ||
return React.createElement(type, R.dissoc("karet-lift", props), ...children) | ||
return React.createElement(type, dissoc("karet-lift", props), ...children) | ||
} | ||
@@ -368,0 +325,0 @@ } else { |
@@ -46,2 +46,6 @@ import * as Kefir from "kefir" | ||
testRender(<div>{Kefir.later(1000,0)}</div>, "") | ||
testRender(<div>{Kefir.constant(1).merge(Kefir.later(1000,0))}</div>, "<div>1</div>") | ||
testRender(<div>{Kefir.later(1000,0)} {Kefir.constant(0)}</div>, "") | ||
const Custom = ({prop, ...props}) => <div>{`${prop} ${JSON.stringify(props)}`}</div> | ||
@@ -48,0 +52,0 @@ |
2
80631
724
- Removedramda@>=0.20.1 <0.23.0
- Removedramda@0.22.1(transitive)