packages feed

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 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