module Language.Nomyx.Rule where
import Prelude hiding (foldr)
import Language.Nomyx.Expression
import Language.Nomyx.Definition
import Control.Arrow
import Data.Lens
import Data.Maybe
import Data.List
autoActivate :: RuleFunc
autoActivate = voidRule $ onEvent_ (RuleEv Proposed) (activateRule_ . _rNumber . ruleData)
legal :: RuleFunc
legal = return $ Meta (\_ -> return $ BoolResp True)
illegal :: RuleFunc
illegal = return $ Meta (\_ -> return $ BoolResp False)
maybeMetaRule :: Rule -> Nomex (Maybe (Rule -> Nomex BoolResp))
maybeMetaRule Rule {_rRuleFunc = rule} = do
meta <- rule
case meta of
(Meta m) -> return $ Just m
_ -> return Nothing
activateOrReject :: Rule -> Bool -> Nomex ()
activateOrReject r b = if b then activateRule_ (_rNumber r) else rejectRule_ (_rNumber r)
forEachPlayer :: (PlayerNumber -> Nomex ()) -> (PlayerNumber -> Nomex ()) -> (PlayerNumber -> Nomex ()) -> Nomex ()
forEachPlayer action actionWhenArrive actionWhenLeave = do
pns <- getAllPlayerNumbers
mapM_ action pns
onEvent_ (Player Arrive) $ \(PlayerData p) -> actionWhenArrive $ _playerNumber p
onEvent_ (Player Leave) $ \(PlayerData p) -> actionWhenLeave $ _playerNumber p
forEachPlayer_ :: (PlayerNumber -> Nomex ()) -> Nomex ()
forEachPlayer_ action = forEachPlayer action action (\_ -> return ())
createValueForEachPlayer :: Int -> MsgVar [(Int, Int)] -> Nomex ()
createValueForEachPlayer initialValue mv = do
pns <- getAllPlayerNumbers
v <- newMsgVar_ (getMsgVarName mv) $ map (,initialValue::Int) pns
forEachPlayer (const $ return ())
(\p -> modifyMsgVar v ((p, initialValue) : ))
(\p -> modifyMsgVar v $ filter $ (/= p) . fst)
createValueForEachPlayer_ :: MsgVar [(Int, Int)] -> Nomex ()
createValueForEachPlayer_ = createValueForEachPlayer 0
getValueOfPlayer :: PlayerNumber -> MsgVar [(Int, Int)] -> Nomex (Maybe Int)
getValueOfPlayer pn var = do
value <- readMsgVar_ var
return $ lookup pn value
modifyValueOfPlayer :: PlayerNumber -> MsgVar [(Int, Int)] -> (Int -> Int) -> Nomex ()
modifyValueOfPlayer pn var f = modifyMsgVar var $ map $ (\(a,b) -> if a == pn then (a, f b) else (a,b))
modifyAllValues :: MsgVar [(Int, Int)] -> (Int -> Int) -> Nomex ()
modifyAllValues var f = modifyMsgVar var $ map $ second f
noPlayPlayer :: PlayerNumber -> RuleFunc
noPlayPlayer p = return $ Meta $ \r -> return $ BoolResp $ (_rProposedBy r) /= p
autoDelete :: Nomex ()
autoDelete = getSelfRuleNumber >>= suppressRule_
eraseAllRules :: PlayerNumber -> Nomex Bool
eraseAllRules p = do
rs <- getRules
let myrs = filter ((== p) . getL rProposedBy) rs
res <- mapM (suppressRule . _rNumber) myrs
return $ and res
showPlayer :: Nomex (PlayerNumber -> String)
showPlayer = do
pls <- getPlayers
return $ (\pn -> _playerName $ fromJust $ find (\(PlayerInfo mypn _) -> mypn == pn) pls)