From 75e1b62dfb6f5307afa2dc74459c9ca2c7dbde41 Mon Sep 17 00:00:00 2001 From: Sidharth Kulkarni Date: Sun, 3 May 2026 14:10:20 -0700 Subject: [PATCH] optics and stuff --- numbersquare.cabal | 108 +++++++++++++++++++++++++++++++++++++++++ package.yaml | 10 ++++ src/Types/GameState.hs | 20 ++++++-- 3 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 numbersquare.cabal diff --git a/numbersquare.cabal b/numbersquare.cabal new file mode 100644 index 0000000..360ba98 --- /dev/null +++ b/numbersquare.cabal @@ -0,0 +1,108 @@ +cabal-version: 1.12 + +-- This file has been generated from package.yaml by hpack version 0.38.3. +-- +-- see: https://github.com/sol/hpack + +name: numbersquare +version: 0.1.0 +synopsis: a game where you number square +description: a game where you number square +category: Games +author: skulk +maintainer: skulk +license: BSD3 +license-file: LICENSE +build-type: Simple + +library + exposed-modules: + Game + Types.BoardPosition + Types.GameBoard + Types.GameMode + Types.GameState + Types.Player + other-modules: + Paths_numbersquare + hs-source-dirs: + src + default-extensions: + ImportQualifiedPost + DataKinds + FlexibleInstances + MultiParamTypeClasses + TypeFamilies + UndecidableInstances + ghc-options: -Wall + build-depends: + array + , base ==4.* + , binary + , containers + , display + , extra + , mtl + , optics + , random + , text + default-language: Haskell2010 + +executable numbersquare + main-is: Main.hs + other-modules: + Paths_numbersquare + hs-source-dirs: + app + default-extensions: + ImportQualifiedPost + DataKinds + FlexibleInstances + MultiParamTypeClasses + TypeFamilies + UndecidableInstances + ghc-options: -Wall + build-depends: + array + , base ==4.* + , binary + , containers + , display + , extra + , mtl + , optics + , random + , text + default-language: Haskell2010 + +test-suite numberspec-test + type: exitcode-stdio-1.0 + main-is: Main.hs + other-modules: + Spec + Paths_numbersquare + hs-source-dirs: + test + default-extensions: + ImportQualifiedPost + DataKinds + FlexibleInstances + MultiParamTypeClasses + TypeFamilies + UndecidableInstances + ghc-options: -Wall -threaded -O0 + build-depends: + QuickCheck + , array + , base ==4.* + , binary + , containers + , display + , extra + , hspec >=2.1.8 + , mtl + , numbersquare + , optics + , random + , text + default-language: Haskell2010 diff --git a/package.yaml b/package.yaml index bdc8f17..967ca5f 100644 --- a/package.yaml +++ b/package.yaml @@ -17,6 +17,16 @@ dependencies: - extra - display - binary + - containers + - optics + +default-extensions: + - ImportQualifiedPost + - DataKinds + - FlexibleInstances + - MultiParamTypeClasses + - TypeFamilies + - UndecidableInstances library: source-dirs: diff --git a/src/Types/GameState.hs b/src/Types/GameState.hs index 14ab207..8ac007c 100644 --- a/src/Types/GameState.hs +++ b/src/Types/GameState.hs @@ -1,13 +1,27 @@ +{-# LANGUAGE TemplateHaskell #-} + module Types.GameState where +import Data.Sequence (Seq) +import Data.Sequence qualified as S +import Optics (makeFieldLabels) +import System.Random import Types.GameBoard import Types.GameMode (GameMode) import Types.Player data GameState mode = MkGameState { board :: GameBoard mode - , players :: [PlayerState] + , players :: Seq PlayerState } -newGame :: (GameMode mode) => mode -> [PlayerName] -> IO (GameState mode) -newGame = undefined +makeFieldLabels ''GameState + +newtype PlayerIndex = MkPlayerIndex Int + deriving (Show, Eq) + +newGame :: (GameMode mode, RandomGen g) => mode -> [PlayerName] -> g -> ((GameState mode), g) +newGame gmode playerInfos rng = + let (initialBoard, nextRng) = newRandomBoard gmode 10 10 rng + playerStates = S.fromList $ map (\n -> MkPlayerState{name = n, score = 0}) playerInfos + in (MkGameState initialBoard playerStates, nextRng)