|
|
- {-# LANGUAGE DeriveGeneric #-}
- module SinglePasses(Output(..), Cell(..), passes) where
-
- import Data.Set(Set(..),difference,union,toList,empty)
- import Data.Maybe
- import Data.Typeable
- import GHC.Generics
- import Data.Aeson
- import Data.Aeson.Types
-
- import qualified Datatypes as DT
- import qualified VM
-
-
- data Cell = Cell { x :: Int, y :: Int}
- deriving (Show, Generic)
-
- data Output = Output { width :: Int,
- height :: Int,
- filled :: [Cell],
- touched :: [Cell],
- unit :: [Cell],
- score :: Int
- }
- deriving (Show, Generic)
-
- instance FromJSON Cell
- instance ToJSON Cell
-
- instance FromJSON Output
- instance ToJSON Output
-
-
- passes :: [(DT.Game, VM.Notes)] -> [Output]
- passes gamesnotes = map generateoutput (gameswithtouched gamesnotes)
- where
- generateoutput ((game,note),touched) = Output { width = DT.width $ DT.board game,
- height = DT.height $ DT.board game,
- filled = filledcells game,
- touched = extractcell touched,
- unit = unitcells game,
- score = DT.score game
- }
- filledcells gm = extractcell $ DT.filled $ DT.board gm
- unitcells gm = if null $ DT.units gm
- then []
- else extractunit $ head $ DT.units gm
-
-
- gameswithtouched :: [(DT.Game,VM.Notes)] -> [((DT.Game,VM.Notes),Set DT.Cell)]
- gameswithtouched els = gameswithtouched0 els Data.Set.empty
-
- gameswithtouched0 :: [(DT.Game,VM.Notes)] -> Set DT.Cell -> [((DT.Game,VM.Notes),Set DT.Cell)]
- gameswithtouched0 [] acc = []
- gameswithtouched0 (x:[]) acc = [(x,acc)]
- gameswithtouched0 (x:xs) acc = (x,touched):lastels
- where
- touched = (difference (difference acc cells) units)
- cells = DT.filled $ DT.board $ fst x
- units = if null $ DT.units $ fst x
- then Data.Set.empty
- else DT.members $ head $ DT.units $ fst x
- touchedcells tc = extractcell touched
- lastels = gameswithtouched0 xs (union touched units)
-
- extractunit :: DT.Unit -> [Cell]
- extractunit unit = extractcell $ DT.members unit
-
- extractcell :: Set DT.Cell -> [Cell]
- extractcell cell = map (\(x,y) -> Cell x y) (toList cell)
|