From 0ddc766aea2da868b4d8db92f508ee4a8eb1d60f Mon Sep 17 00:00:00 2001 From: Paul-Henri Froidmont Date: Tue, 10 Dec 2019 00:09:55 +0100 Subject: [PATCH] Add nice, documented CLI parameters --- app/Main.hs | 32 ++++++++++++++++++++++++-------- minesweeper.cabal | 3 ++- package.yaml | 1 + 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/app/Main.hs b/app/Main.hs index c766220..6e34175 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -1,19 +1,35 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE StandaloneDeriving #-} +{-# LANGUAGE TypeOperators #-} + module Main where import Lib -import System.Environment +import Options.Generic import System.Random import Text.Read +data Parameters w = + Parameters + { width :: w ::: Int "Width of the board" + , length :: w ::: Int "Length of the board" + , bombs :: w ::: Int "Number of bombs to be placed" + } + deriving (Generic) + +instance ParseRecord (Parameters Wrapped) + +deriving instance Show (Parameters Unwrapped) + main :: IO () main = do - args <- getArgs - let boardWidth = read (head args) - boardLength = read (args !! 1) - bombs = read (args !! 2) + (Parameters boardWidth boardLength bombsCount) <- unwrapRecord "Minesweeper" generator <- newStdGen gameStep . createBoard boardWidth boardLength $ - generateRandomCoordinates (boardWidth - 1) (boardLength - 1) bombs generator + generateRandomCoordinates (boardWidth - 1) (boardLength - 1) bombsCount generator gameStep :: Board -> IO () gameStep board = do @@ -32,8 +48,8 @@ getCoordinates = do xString <- getLine yString <- getLine case (readMaybe xString, readMaybe yString) of - (Just x, Just y) -> return (x,y) - _ -> putStrLn "Invalid coordinates!" >> getCoordinates + (Just x, Just y) -> return (x, y) + _ -> putStrLn "Invalid coordinates!" >> getCoordinates gameLost :: Board -> IO () gameLost board = do diff --git a/minesweeper.cabal b/minesweeper.cabal index 140acb1..24359a6 100644 --- a/minesweeper.cabal +++ b/minesweeper.cabal @@ -4,7 +4,7 @@ cabal-version: 1.12 -- -- see: https://github.com/sol/hpack -- --- hash: 512c036467601196724c0e9412fc6175989ea1a8c48bf158d2cf62aa1c0b4311 +-- hash: ae0d0337fef94e96da9aaca377817a7cbca70851243db8fe2a6c435fe06f0cfa name: minesweeper version: 0.1.0.0 @@ -37,6 +37,7 @@ executable minesweeper build-depends: base , minesweeper + , optparse-generic , random default-language: Haskell2010 diff --git a/package.yaml b/package.yaml index bf66d5f..75ff961 100644 --- a/package.yaml +++ b/package.yaml @@ -24,6 +24,7 @@ executables: dependencies: - minesweeper - random + - optparse-generic tests: minesweeper-test: