raid-fl
Version:
Raid with fantasy-land compliant structures
100 lines (74 loc) • 2.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.connect = exports.createActions = exports.createAction = void 0;
var _forceArray = _interopRequireDefault(require("force-array"));
var _fantasyLand = _interopRequireDefault(require("fantasy-land"));
var _utils = require("./utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const rFANTASY = /^fantasy-land\//;
const alias = c => Object.getOwnPropertyNames(c).filter(n => rFANTASY.test(n)).map(n => [n.replace(rFANTASY, ''), c[n]]);
const aliasType = c => {
alias(c).forEach(([alias, fn]) => {
c[alias] = fn;
});
alias(c.prototype).forEach(([alias, fn]) => {
c.prototype[alias] = fn;
});
return c;
};
const createAction = name => {
var action = {
[name]: class {
constructor(value) {
this.__value = value;
this['@@type'] = name;
}
static [_fantasyLand.default.of](value) {
return new action[name](value);
}
static of(value) {
return new action[name](value);
}
static is(type) {
return type instanceof action[name];
}
[_fantasyLand.default.map](fn) {
return action[name].of(fn(this.join()));
}
[_fantasyLand.default.ap](m) {
return m.chain(fn => this.map(fn));
}
[_fantasyLand.default.chain](fn) {
return fn(this.join());
}
[_fantasyLand.default.equals](a) {
return a.join() === this.join();
}
lift(m) {
return m.map(this.__value);
}
join() {
return this.__value;
}
unwrapOrElse(_default) {
return typeof this.join() === 'undefined' ? _default : this.join();
}
}
};
return aliasType(action[name]);
};
exports.createAction = createAction;
const createActions = actions => (0, _forceArray.default)(actions).filter(_utils.isString).map(createAction);
exports.createActions = createActions;
const connect = signal => actions => createActions(actions).map(Action => {
Action.of = value => {
const action = new Action(value);
signal.emit(action);
return action;
};
Action[_fantasyLand.default.of] = Action.of;
return Action;
});
exports.connect = connect;