Nomyx-Language 0.7.0 → 0.7.1
raw patch · 8 files changed
+42/−53 lines, 8 filessetup-changedPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Language.Nomyx.Expression: Index :: Int -> FieldAddressElem
+ Language.Nomyx.Examples: helloButton :: Rule
+ Language.Nomyx.Expression: Shortcut :: FieldAddressElem
- Language.Nomyx.Vote: callVote :: AssessFunction -> UTCTime -> String -> ([(PlayerNumber, Maybe Bool)] -> Nomex ()) -> Nomex ()
+ Language.Nomyx.Vote: callVote :: AssessFunction -> UTCTime -> String -> RuleNumber -> ([(PlayerNumber, Maybe Bool)] -> Nomex ()) -> Nomex ()
- Language.Nomyx.Vote: displayVote :: EventNumber -> Nomex ()
+ Language.Nomyx.Vote: displayVote :: EventNumber -> RuleNumber -> Nomex ()
- Language.Nomyx.Vote: showOnGoingVote :: [(PlayerNumber, Maybe Bool)] -> NomexNE String
+ Language.Nomyx.Vote: showOnGoingVote :: [(PlayerNumber, Maybe Bool)] -> RuleNumber -> NomexNE String
Files
- Nomyx-Language.cabal +1/−1
- Setup.hs +2/−0
- Setup.lhs +0/−6
- src/Control/Shortcut.hs +0/−2
- src/Language/Nomyx/Events.hs +0/−2
- src/Language/Nomyx/Examples.hs +23/−22
- src/Language/Nomyx/Expression.hs +1/−1
- src/Language/Nomyx/Vote.hs +15/−19
Nomyx-Language.cabal view
@@ -1,5 +1,5 @@ name: Nomyx-Language-version: 0.7.0+version: 0.7.1 cabal-version: >=1.6 ---Warning: to use "cabal sdist", this patch is needed in cabal: https://github.com/haskell/cabal/pull/1110 ---This allows cabal to work with exported generated modules (Paths_Nomyx_Language)
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
− Setup.lhs
@@ -1,6 +0,0 @@-#!/usr/bin/runhaskell -> module Main where-> import Distribution.Simple-> main :: IO ()-> main = defaultMain-
src/Control/Shortcut.hs view
@@ -3,8 +3,6 @@ module Control.Shortcut where import Control.Applicative-import Control.Monad-import Data.Either import Data.Maybe -- | class of things that can be run in parallel and can be shortcuted.
src/Language/Nomyx/Events.hs view
@@ -20,10 +20,8 @@ import Data.Typeable import Control.Monad.State import Control.Applicative-import Control.Shortcut import Data.List import Data.Maybe-import Data.Either import Data.Time hiding (getCurrentTime) import Data.Time.Recurrence hiding (filter) import Safe
src/Language/Nomyx/Examples.hs view
@@ -34,6 +34,7 @@ bravoButton, enterHaiku, displayBankAccount,+ helloButton, module X) where import Data.Function@@ -44,7 +45,6 @@ import Data.Maybe import Control.Arrow import Control.Monad as X-import Control.Applicative import Safe (readDef) import Language.Nomyx @@ -201,34 +201,14 @@ delPlayer pn void $ onEvent_ (playerEvent Arrive) $ const $ void $ delPlayer pn --- * Referendum & elections --- | triggers a referendum, if the outcome is yes player 2 will be kicked---referendumOnKickPlayer :: Rule---referendumOnKickPlayer = referendum " kick player 2" (void $ delPlayer 2)-------- | triggers elections (all players are candidates), the winner becomes game master---gameMasterElections :: Rule---gameMasterElections = do--- pls <- liftEffect getPlayers--- elections "Game Master" pls makeGM--makeGM :: PlayerNumber -> Nomex ()-makeGM pn = do- newMsgVar "GameMaster" pn- void $ modifyPlayerName pn ("GameMaster " ++)--gameMaster :: MsgVar PlayerNumber-gameMaster = msgVar "GameMaster"- -- | display a button and greets you when pressed (for player 1) bravoButton :: Rule bravoButton = void $ onInputButton_ "Click here:" (const $ outputAll_ "Bravo!") 1 -- | display a button to greet other players helloButton :: Rule-helloButton =- do+helloButton = do --get your own player number me <- getProposerNumber_ --create an output for me only@@ -241,6 +221,27 @@ enterHaiku :: Rule enterHaiku = void $ onInputTextarea_ "Enter a haiku:" outputAll_ 1+++-- * Referendum & elections++-- | triggers a referendum, if the outcome is yes player 2 will be kicked+--referendumOnKickPlayer :: Rule+--referendumOnKickPlayer = referendum " kick player 2" (void $ delPlayer 2)+--+---- | triggers elections (all players are candidates), the winner becomes game master+--gameMasterElections :: Rule+--gameMasterElections = do+-- pls <- liftEffect getPlayers+-- elections "Game Master" pls makeGM++makeGM :: PlayerNumber -> Nomex ()+makeGM pn = do+ newMsgVar "GameMaster" pn+ void $ modifyPlayerName pn ("GameMaster " ++)++gameMaster :: MsgVar PlayerNumber+gameMaster = msgVar "GameMaster" tournamentMasterCandidates :: Rule tournamentMasterCandidates = do
src/Language/Nomyx/Expression.hs view
@@ -231,7 +231,7 @@ _evStatus :: Status, _env :: [FieldResult]} -data FieldAddressElem = SumR | SumL | AppR | AppL | BindR | BindL | Index Int deriving (Show, Read, Ord, Eq, Generic)+data FieldAddressElem = SumR | SumL | AppR | AppL | BindR | BindL | Shortcut deriving (Show, Read, Ord, Eq, Generic) type FieldAddress = [FieldAddressElem] data FieldResult = forall e. (Typeable e, Show e) =>
src/Language/Nomyx/Vote.hs view
@@ -24,7 +24,6 @@ import Control.Shortcut import Data.List import qualified Data.Map as M-import Debug.Trace -- | a vote assessing function (such as unanimity, majority...) type AssessFunction = VoteStats -> Maybe Bool@@ -47,23 +46,22 @@ callVoteRule' assess endTime ri callVoteRule' :: AssessFunction -> UTCTime -> RuleInfo -> Nomex ()-callVoteRule' assess endTime ri = do- let title = "Vote for rule: \"" ++ (_rName ri) ++ "\" (#" ++ (show $ _rNumber ri) ++ "):"- callVote assess endTime title (finishVote assess ri)+callVoteRule' assess endTime ri = callVote assess endTime (_rName ri) (_rNumber ri) (finishVote assess ri) -- | actions to do when the vote is finished finishVote :: AssessFunction -> RuleInfo -> [(PlayerNumber, Maybe Bool)] -> Nomex () finishVote assess ri vs = do- let passed = fromJust $ assess $ getVoteStats (map snd vs) True- activateOrRejectRule ri passed- void $ outputAll $ showFinishedVote (_rNumber ri) passed vs+ let passed = fromJust $ assess $ getVoteStats (map snd vs) True+ activateOrRejectRule ri passed+ void $ outputAll $ showFinishedVote (_rNumber ri) passed vs -- | call a vote for every players, with an assessing function, a delay and a function to run on the result-callVote :: AssessFunction -> UTCTime -> String -> ([(PlayerNumber, Maybe Bool)] -> Nomex ()) -> Nomex ()-callVote assess endTime title payload = do+callVote :: AssessFunction -> UTCTime -> String -> RuleNumber -> ([(PlayerNumber, Maybe Bool)] -> Nomex ()) -> Nomex ()+callVote assess endTime name rn payload = do+ let title = "Vote for rule: \"" ++ name ++ "\" (#" ++ (show rn) ++ "):" en <- onEventOnce (voteWith endTime assess title) payload- displayVote en+ displayVote en rn -- | vote with a function able to assess the ongoing votes. -- | the vote can be concluded as soon as the result is known.@@ -76,7 +74,6 @@ (vs, _)<- shortcut2b voteEvents timerEvent isFinished return $ zip pns vs - -- trigger the display of a radio button choice on the player screen, yelding either True or False. -- after the time limit, the value sent back is Nothing. singleVote :: String -> PlayerNumber -> Event Bool@@ -134,13 +131,13 @@ notVoted vs = (nbParticipants vs) - (voted vs) voted vs = M.findWithDefault 0 True (voteCounts vs) + M.findWithDefault 0 False (voteCounts vs) -displayVote :: EventNumber -> Nomex ()-displayVote en = void $ outputAll $ do+displayVote :: EventNumber -> RuleNumber -> Nomex ()+displayVote en rn = void $ outputAll $ do mds <- getIntermediateResults en let mbs = map getBooleanResult <$> mds pns <- getAllPlayerNumbers case mbs of- Just bs -> showOnGoingVote $ getVotes pns bs+ Just bs -> showOnGoingVote (getVotes pns bs) rn Nothing -> return "" getVotes :: [PlayerNumber] -> [(PlayerNumber, Bool)] -> [(PlayerNumber, Maybe Bool)]@@ -155,12 +152,11 @@ Just a -> (pn, a) Nothing -> error "incorrect vote field" --showOnGoingVote :: [(PlayerNumber, Maybe Bool)] -> NomexNE String-showOnGoingVote [] = return "Nobody voted yet"-showOnGoingVote listVotes = do+showOnGoingVote :: [(PlayerNumber, Maybe Bool)] -> RuleNumber -> NomexNE String+showOnGoingVote [] rn = return $ "Votes for rule #" ++ (show rn) ++ ": Nobody voted yet"+showOnGoingVote listVotes rn = do list <- mapM showVote listVotes- return $ "Votes:" ++ "\n" ++ concatMap (\(name, vote) -> name ++ "\t" ++ vote ++ "\n") list+ return $ "Votes for rule #" ++ (show rn) ++ ":" ++ "\n" ++ concatMap (\(name, vote) -> name ++ "\t" ++ vote ++ "\n") list showFinishedVote :: RuleNumber -> Bool -> [(PlayerNumber, Maybe Bool)] -> NomexNE String showFinishedVote rn passed l = do