Skip to content

Commit

Permalink
evolvers as array (#13)
Browse files Browse the repository at this point in the history
Co-authored-by: Jake Lauer <jakelauer@Jake-MacBook-M2-2.local>
  • Loading branch information
jakelauer and Jake Lauer committed May 27, 2024
1 parent 97bd747 commit 85ae944
Show file tree
Hide file tree
Showing 25 changed files with 1,754 additions and 233 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import { GameTurnEvolver } from "./evolvers/GameTurnEvolver";
import { GameBoardEvolver } from "./evolvers/GameBoardEvolver";
import { GameMetaEvolver } from "./evolvers/GameMetaEvolver";

export const GameEvolverComplex = EvolverComplex.create<GameState>().withEvolvers({
export const GameEvolverComplex = EvolverComplex.create<GameState>().withEvolvers(
GameTurnEvolver,
GameBoardEvolver,
GameMetaEvolver,
});
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { EvolverComplex } from "theseus-js";
import type { GameState } from "../state/GameState";
import { GameTurnEvolver } from "./evolvers/GameTurnEvolver";
import { GameBoardEvolver } from "./evolvers/GameBoardEvolver";
import { GameMetaEvolver } from "./evolvers/GameMetaEvolver";

<<<<<<< HEAD
export const GameEvolverComplex = EvolverComplex.create<GameState>().withEvolvers(
GameTurnEvolver,
GameBoardEvolver,
GameMetaEvolver,
);
=======
export const GameEvolverComplex = EvolverComplex.create<GameState>().withEvolvers({
GameTurnEvolver,
GameBoardEvolver,
GameMetaEvolver,
});
>>>>>>> main
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Evolver } from "theseus-js";
import type { GameState, MarkType } from "../../state/GameState";

export const { GameBoardEvolver } = Evolver.create("GameBoardEvolver", { noun: "gameState" })
export const GameBoardEvolver = Evolver.create("GameBoard", { noun: "gameState" })
.toEvolve<GameState>()
.withMutators({
/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { Evolver } from "theseus-js";
import type { GameState, MarkType } from "../../state/GameState";

<<<<<<< HEAD
export const GameBoardEvolver = Evolver.create("GameBoard", { noun: "gameState" })
.toEvolve<GameState>()
.withMutators({
/**
=======
export const { GameBoardEvolver } = Evolver.create("GameBoardEvolver", { noun: "gameState" })
.toEvolve<GameState>()
.withMutators({
/**
>>>>>>> main
* Set the mark at the given coordinates.
*/
setMark: ({ mutableGameState }, coords: [number, number], mark: MarkType): GameState =>
{
const [row, col] = coords;
mutableGameState.board[row][col] = mark;
return mutableGameState;
},
});
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Evolver } from "theseus-js";
import type { GameState, MarkType } from "../../state/GameState";

export const { GameMetaEvolver } = Evolver.create("GameMetaEvolver", { noun: "gameState" })
export const GameMetaEvolver = Evolver.create("GameMeta", { noun: "gameState" })
.toEvolve<GameState>()
.withMutators({
/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { Evolver } from "theseus-js";
import type { GameState, MarkType } from "../../state/GameState";

<<<<<<< HEAD
export const GameMetaEvolver = Evolver.create("GameMeta", { noun: "gameState" })
.toEvolve<GameState>()
.withMutators({
/**
=======
export const { GameMetaEvolver } = Evolver.create("GameMetaEvolver", { noun: "gameState" })
.toEvolve<GameState>()
.withMutators({
/**
>>>>>>> main
* Update the last player to make a move.
*/
updateLastPlayer: ({ mutableGameState }, mark: MarkType): GameState =>
{
mutableGameState.lastPlayer = mark;
return mutableGameState;
},
/**
* Update the last played coordinates.
*/
updateLastPlayedCoords: ({ mutableGameState }, coords: [number, number]): GameState =>
{
mutableGameState.lastPlayedCoords = coords;
return mutableGameState;
},
/**
* Iterate the turn count.
*/
iterateTurnCount: ({ mutableGameState }): GameState =>
{
mutableGameState.turns++;
return mutableGameState;
},
});
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { GameMetaEvolver } from "./GameMetaEvolver";

const log = getTheseusLogger("GameTurnEvolver");

export const { GameTurnEvolver } = Evolver.create("GameTurnEvolver", { noun: "gameState" })
export const GameTurnEvolver = Evolver.create("GameTurn", { noun: "gameState" })
.toEvolve<GameState>()
.withMutators({
/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import { Evolver, getTheseusLogger } from "theseus-js";
import type { GameState } from "../../state/GameState";
import { GameBoardRefinery } from "../../refine/refineries/GameBoardRefinery";
import { GameBoardEvolver } from "./GameBoardEvolver";
import { GameMetaEvolver } from "./GameMetaEvolver";

const log = getTheseusLogger("GameTurnEvolver");

<<<<<<< HEAD
export const GameTurnEvolver = Evolver.create("GameTurn", { noun: "gameState" })
.toEvolve<GameState>()
.withMutators({
/**
=======
export const { GameTurnEvolver } = Evolver.create("GameTurnEvolver", { noun: "gameState" })
.toEvolve<GameState>()
.withMutators({
/**
>>>>>>> main
* Set the winner of the game.
*/
setWinner: ({ mutableGameState }, reason: "stalemate" | "winner") =>
{
log.major(`Game over! ${reason}`);
mutableGameState.winner = reason === "winner" ? mutableGameState.lastPlayer : "stalemate";
return mutableGameState;
},
/**
* Take the next turn at a random available square.
*/
nextTurn: ({ mutableGameState }): GameState =>
{
const { turns, lastPlayer } = mutableGameState;
log.major(`Taking turn #${turns}`);

const { getRandomAvailableCoords, getSquare } = GameBoardRefinery(mutableGameState);

// Determine the mark for the next player
const mark = lastPlayer === "X" ? "O" : "X";
const coords = getRandomAvailableCoords();
if (!coords)
{
return GameTurnEvolver.mutate(mutableGameState).via.setWinner("stalemate");
}

// Check if the square is available
const isAvailable = !getSquare(coords);
if (!isAvailable)
{
throw new Error(`Square at ${coords} is already taken`);
}

// Set the mark on the board
GameBoardEvolver.mutate(mutableGameState)
.via.setMark(coords, mark);

// Update the game metadata
GameMetaEvolver.evolve(mutableGameState)
.via.iterateTurnCount()
.and.updateLastPlayer(mark)
.and.updateLastPlayedCoords(coords);

return mutableGameState;
},
});
Loading

0 comments on commit 85ae944

Please sign in to comment.