UNPKG

tsgammon-core

Version:

A Backgammon library for Typescript, formerly developed as a part of tsgammon-ui

82 lines (81 loc) 3.79 kB
"use strict"; 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;