packages feed

werewolf-0.4.5.0: src/Game/Werewolf/Player.hs

{-|
Module      : Game.Werewolf.Player
Description : Player data structures.

Copyright   : (c) Henry J. Wylde, 2015
License     : BSD3
Maintainer  : public@hjwylde.com

Player data structures.
-}

{-# LANGUAGE TemplateHaskell #-}

module Game.Werewolf.Player (
    -- * Player
    Player, name, role, state,
    newPlayer,

    -- ** Searches
    findByName, findByName_, findByRole, findByRole_,

    -- ** Filters
    filterByRole,
    filterWerewolves,

    -- ** Queries
    doesPlayerExist,
    isAngel, isDefender, isScapegoat, isSeer, isSimpleVillager, isSimpleWerewolf,
    isVillagerVillager, isWildChild, isWitch, isWolfHound,
    isVillager, isWerewolf,
    isAlive, isDead,

    -- * State
    State(..),

    -- ** Filters
    filterAlive, filterDead,
) where

import Control.Lens

import Data.List
import Data.Maybe
import Data.Text  (Text)

import Game.Werewolf.Role hiding (name)

data Player = Player
    { _name  :: Text
    , _role  :: Role
    , _state :: State
    } deriving (Eq, Read, Show)

data State = Alive | Dead
    deriving (Eq, Read, Show)

makeLenses ''Player

newPlayer :: Text -> Role -> Player
newPlayer name role = Player name role Alive

findByName :: Text -> [Player] -> Maybe Player
findByName name' = find ((name' ==) . view name)

findByName_ :: Text -> [Player] -> Player
findByName_ name = fromJust . findByName name

findByRole :: Role -> [Player] -> Maybe Player
findByRole role' = find ((role' ==) . view role)

findByRole_ :: Role -> [Player] -> Player
findByRole_ role = fromJust . findByRole role

filterByRole :: Role -> [Player] -> [Player]
filterByRole role' = filter ((role' ==) . view role)

filterWerewolves :: [Player] -> [Player]
filterWerewolves = filter isWerewolf

doesPlayerExist :: Text -> [Player] -> Bool
doesPlayerExist name = isJust . findByName name

isAngel :: Player -> Bool
isAngel player = player ^. role == angelRole

isDefender :: Player -> Bool
isDefender player = player ^. role == defenderRole

isScapegoat :: Player -> Bool
isScapegoat player = player ^. role == scapegoatRole

isSeer :: Player -> Bool
isSeer player = player ^. role == seerRole

isSimpleVillager :: Player -> Bool
isSimpleVillager player = player ^. role == simpleVillagerRole

isSimpleWerewolf :: Player -> Bool
isSimpleWerewolf player = player ^. role == simpleWerewolfRole

isVillagerVillager :: Player -> Bool
isVillagerVillager player = player ^. role == villagerVillagerRole

isWildChild :: Player -> Bool
isWildChild player = player ^. role == wildChildRole

isWitch :: Player -> Bool
isWitch player = player ^. role == witchRole

isWolfHound :: Player -> Bool
isWolfHound player = player ^. role == wolfHoundRole

isVillager :: Player -> Bool
isVillager player = player ^. role . allegiance == Villagers

isWerewolf :: Player -> Bool
isWerewolf player = player ^. role . allegiance == Werewolves

isAlive :: Player -> Bool
isAlive player = player ^. state == Alive

isDead :: Player -> Bool
isDead player = player ^. state == Dead

filterAlive :: [Player] -> [Player]
filterAlive = filter isAlive

filterDead :: [Player] -> [Player]
filterDead = filter isDead