tsgammon-core
Version:
A Backgammon library for Typescript, formerly developed as a part of tsgammon-ui
121 lines (120 loc) • 5.41 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.cubeGameDispatcher = exports.setCBStateListener = exports.concatCBListeners = void 0;
const CubeGameState_1 = require("./CubeGameState");
const concat_1 = require("./utils/concat");
function concatCBListeners(base, ...listeners) {
return listeners.reduce((prev, cur) => {
return {
onCubeGameStarted: (0, concat_1.concat0)(prev === null || prev === void 0 ? void 0 : prev.onCubeGameStarted, cur === null || cur === void 0 ? void 0 : cur.onCubeGameStarted),
onAwaitCubeAction: (0, concat_1.concat1)(prev === null || prev === void 0 ? void 0 : prev.onAwaitCubeAction, cur === null || cur === void 0 ? void 0 : cur.onAwaitCubeAction),
onCubeActionStarted: (0, concat_1.concat1)(prev === null || prev === void 0 ? void 0 : prev.onCubeActionStarted, cur === null || cur === void 0 ? void 0 : cur.onCubeActionStarted),
onAwaitCheckerPlay: (0, concat_1.concat1)(prev === null || prev === void 0 ? void 0 : prev.onAwaitCheckerPlay, cur === null || cur === void 0 ? void 0 : cur.onAwaitCheckerPlay),
onDoubled: (0, concat_1.concat2)(prev === null || prev === void 0 ? void 0 : prev.onDoubled, cur === null || cur === void 0 ? void 0 : cur.onDoubled),
onDoubleAccepted: (0, concat_1.concat2)(prev === null || prev === void 0 ? void 0 : prev.onDoubleAccepted, cur === null || cur === void 0 ? void 0 : cur.onDoubleAccepted),
onCubeActionSkipped: (0, concat_1.concat1)(prev === null || prev === void 0 ? void 0 : prev.onCubeActionSkipped, cur === null || cur === void 0 ? void 0 : cur.onCubeActionSkipped),
onEndOfCubeGame: (0, concat_1.concat1)(prev === null || prev === void 0 ? void 0 : prev.onEndOfCubeGame, cur === null || cur === void 0 ? void 0 : cur.onEndOfCubeGame),
};
}, base);
}
exports.concatCBListeners = concatCBListeners;
function setCBStateListener(defaultState, setCBState) {
return {
onCubeGameStarted: () => setCBState(defaultState),
onAwaitCubeAction: () => {
//
},
onCubeActionStarted: setCBState,
onAwaitCheckerPlay: setCBState,
onDoubled: setCBState,
onDoubleAccepted: setCBState,
onPassed: () => {
//
},
onCubeActionSkipped: setCBState,
onEndOfCubeGame: setCBState,
};
}
exports.setCBStateListener = setCBStateListener;
exports.cubeGameDispatcher = {
doStartCubeGame,
doDouble,
doSkipCubeAction,
doTake,
doPass,
doStartCubeAction,
doStartOpeningCheckerPlay,
doStartCheckerPlay,
doEndOfCubeGame,
};
function doStartCubeGame() {
return (listeners) => {
var _a;
(_a = listeners.onCubeGameStarted) === null || _a === void 0 ? void 0 : _a.call(listeners);
};
}
function doDouble(state) {
const nextState = state.doDouble();
return (listeners) => {
var _a;
(_a = listeners.onDoubled) === null || _a === void 0 ? void 0 : _a.call(listeners, nextState, state);
};
}
function doSkipCubeAction(state) {
const nextState = state.doSkipCubeAction();
return (listeners) => {
var _a;
(_a = listeners.onCubeActionSkipped) === null || _a === void 0 ? void 0 : _a.call(listeners, nextState);
};
}
function doTake(state) {
const nextState = state.doTake();
return (listeners) => {
var _a;
(_a = listeners.onDoubleAccepted) === null || _a === void 0 ? void 0 : _a.call(listeners, nextState, state);
};
}
function doPass(state) {
const nextState = state.doPass();
return (listeners) => {
var _a, _b;
(_a = listeners.onPassed) === null || _a === void 0 ? void 0 : _a.call(listeners, state, state.isDoubleFromRed);
(_b = listeners.onEndOfCubeGame) === null || _b === void 0 ? void 0 : _b.call(listeners, nextState);
};
}
function doStartCubeAction(state, skipCubeAction) {
const nextState = state.doStartCubeAction(skipCubeAction(state));
return (listeners) => {
var _a, _b, _c;
(_a = listeners.onAwaitCubeAction) === null || _a === void 0 ? void 0 : _a.call(listeners, nextState);
if (nextState.tag === 'CBAction') {
(_b = listeners.onCubeActionStarted) === null || _b === void 0 ? void 0 : _b.call(listeners, nextState);
}
else {
(_c = listeners.onCubeActionSkipped) === null || _c === void 0 ? void 0 : _c.call(listeners, nextState);
}
};
}
function doStartOpeningCheckerPlay(state, isRed) {
const nextState = isRed
? state.doStartCheckerPlayRed()
: state.doStartCheckerPlayWhite();
return (listeners) => {
var _a;
(_a = listeners.onAwaitCheckerPlay) === null || _a === void 0 ? void 0 : _a.call(listeners, nextState);
};
}
function doStartCheckerPlay(state) {
const nextState = state.doStartCheckerPlay();
return (listeners) => {
var _a;
(_a = listeners.onAwaitCheckerPlay) === null || _a === void 0 ? void 0 : _a.call(listeners, nextState);
};
}
function doEndOfCubeGame(state, sgResult, eogStatus) {
const nextState = (0, CubeGameState_1.resultToCBEoG)(state.cubeState, sgResult, eogStatus);
return (listeners) => {
var _a;
(_a = listeners.onEndOfCubeGame) === null || _a === void 0 ? void 0 : _a.call(listeners, nextState);
};
}