tsgammon-core
Version:
A Backgammon library for Typescript, formerly developed as a part of tsgammon-ui
82 lines (81 loc) • 3.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.concatSGListeners = exports.buildSGEventHandler = void 0;
const RollDispatcher_1 = require("./RollDispatcher");
const SingleGameDispatcher_1 = require("./SingleGameDispatcher");
const concat_1 = require("./utils/concat");
/**
* チェッカープレイを管理する、SingleGameEventHandler
* (SingleGameEventHandlerExtensible)オブジェクトを生成する
* @param rListener
* @param listeners
* @returns
*/
function buildSGEventHandler(rListener = (0, RollDispatcher_1.rollListener)(), ...listeners) {
return buildSGEventHandler_rec(rListener, {}, ...listeners);
}
exports.buildSGEventHandler = buildSGEventHandler;
function buildSGEventHandler_rec(rollListener, sgListener, ...listeners) {
const listener = Object.assign(Object.assign({}, emptySGListener), listeners.reduce((prev, cur) => concatSGListeners(prev, cur), sgListener));
const addListeners = (...toAdd) => {
return buildSGEventHandler_rec(rollListener, listener, ...toAdd);
};
return Object.assign(Object.assign({}, _buildSGEventHandler(rollListener, listener)), { addListeners });
}
function _buildSGEventHandler(rollListener, listeners) {
return {
onStartGame: () => {
const result = SingleGameDispatcher_1.singleGameDispatcher.doStartGame();
result(listeners);
},
onCommit: (state) => {
const result = SingleGameDispatcher_1.singleGameDispatcher.doCommitCheckerPlay(state);
result(listeners);
},
onRoll: (sgState) => rollListener.onRollRequest((dices) => {
const result = SingleGameDispatcher_1.singleGameDispatcher.doRoll(sgState, dices);
result(listeners);
}),
onRollOpening: (sgState) => rollListener.onRollRequest((dices) => {
const result = SingleGameDispatcher_1.singleGameDispatcher.doOpeningRoll(sgState, dices);
result(listeners);
}),
};
}
const emptySGListener = {
onAwaitRoll: () => {
//
},
onCheckerPlayCommitted: () => {
//
},
onCheckerPlayStarted: () => {
//
},
onEndOfGame: () => {
//
},
onGameStarted: () => {
//
},
onOpeningCheckerPlayStarted: () => {
//
},
onRerollOpening: () => {
//
},
};
function concatSGListeners(base, ...listners) {
return listners.reduce((prev, cur) => {
return {
onGameStarted: (0, concat_1.concat0)(prev === null || prev === void 0 ? void 0 : prev.onGameStarted, cur === null || cur === void 0 ? void 0 : cur.onGameStarted),
onOpeningCheckerPlayStarted: (0, concat_1.concat1)(prev === null || prev === void 0 ? void 0 : prev.onOpeningCheckerPlayStarted, cur === null || cur === void 0 ? void 0 : cur.onOpeningCheckerPlayStarted),
onCheckerPlayStarted: (0, concat_1.concat1)(prev === null || prev === void 0 ? void 0 : prev.onCheckerPlayStarted, cur === null || cur === void 0 ? void 0 : cur.onCheckerPlayStarted),
onCheckerPlayCommitted: (0, concat_1.concat1)(prev.onCheckerPlayCommitted, cur.onCheckerPlayCommitted),
onRerollOpening: (0, concat_1.concat1)(prev === null || prev === void 0 ? void 0 : prev.onRerollOpening, cur === null || cur === void 0 ? void 0 : cur.onRerollOpening),
onAwaitRoll: (0, concat_1.concat1)(prev === null || prev === void 0 ? void 0 : prev.onAwaitRoll, cur === null || cur === void 0 ? void 0 : cur.onAwaitRoll),
onEndOfGame: (0, concat_1.concat1)(prev === null || prev === void 0 ? void 0 : prev.onEndOfGame, cur === null || cur === void 0 ? void 0 : cur.onEndOfGame),
};
}, base);
}
exports.concatSGListeners = concatSGListeners;