packages feed

Nomyx-Language 0.7.3 → 0.7.4

raw patch · 4 files changed

+65/−24 lines, 4 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Language.Nomyx.Examples: createBankAccount :: Rule
- Language.Nomyx.Examples: displayBankAccount :: Rule
- Language.Nomyx.Vote: displayVote :: EventNumber -> RuleNumber -> Nomex ()
+ Language.Nomyx.Examples: createBankAccounts :: Rule
+ Language.Nomyx.Examples: displayBankAccounts :: Rule
+ Language.Nomyx.Rules: proposeRule :: RuleInfo -> Nomex Bool
+ Language.Nomyx.Vote: VoteBegin :: RuleInfo -> UTCTime -> EventNumber -> VoteBegin
+ Language.Nomyx.Vote: VoteEnd :: RuleInfo -> [(PlayerNumber, Maybe Bool)] -> Bool -> UTCTime -> VoteEnd
+ Language.Nomyx.Vote: data VoteBegin
+ Language.Nomyx.Vote: data VoteEnd
+ Language.Nomyx.Vote: displayFinishedVote :: VoteEnd -> Nomex ()
+ Language.Nomyx.Vote: displayOnGoingVote :: VoteBegin -> Nomex ()
+ Language.Nomyx.Vote: displayVotes :: Nomex ()
+ Language.Nomyx.Vote: instance Eq VoteBegin
+ Language.Nomyx.Vote: instance Eq VoteEnd
+ Language.Nomyx.Vote: instance Ord VoteBegin
+ Language.Nomyx.Vote: instance Ord VoteEnd
+ Language.Nomyx.Vote: instance Show VoteBegin
+ Language.Nomyx.Vote: instance Show VoteEnd
+ Language.Nomyx.Vote: instance Typeable VoteBegin
+ Language.Nomyx.Vote: instance Typeable VoteEnd
+ Language.Nomyx.Vote: vbEndAt :: VoteBegin -> UTCTime
+ Language.Nomyx.Vote: vbEventNumber :: VoteBegin -> EventNumber
+ Language.Nomyx.Vote: vbRule :: VoteBegin -> RuleInfo
+ Language.Nomyx.Vote: veFinishedAt :: VoteEnd -> UTCTime
+ Language.Nomyx.Vote: vePassed :: VoteEnd -> Bool
+ Language.Nomyx.Vote: veRule :: VoteEnd -> RuleInfo
+ Language.Nomyx.Vote: veVotes :: VoteEnd -> [(PlayerNumber, Maybe Bool)]
+ Language.Nomyx.Vote: voteBegin :: Msg VoteBegin
+ Language.Nomyx.Vote: voteEnd :: Msg VoteEnd
- Language.Nomyx.Vote: callVote :: AssessFunction -> UTCTime -> String -> RuleNumber -> ([(PlayerNumber, Maybe Bool)] -> Nomex ()) -> Nomex ()
+ Language.Nomyx.Vote: callVote :: AssessFunction -> UTCTime -> String -> RuleNumber -> ([(PlayerNumber, Maybe Bool)] -> Nomex ()) -> Nomex EventNumber
- Language.Nomyx.Vote: showFinishedVote :: RuleNumber -> Bool -> [(PlayerNumber, Maybe Bool)] -> NomexNE String
+ Language.Nomyx.Vote: showFinishedVote :: RuleNumber -> Bool -> [(PlayerNumber, Maybe Bool)] -> UTCTime -> NomexNE String
- Language.Nomyx.Vote: showOnGoingVote :: [(PlayerNumber, Maybe Bool)] -> RuleNumber -> NomexNE String
+ Language.Nomyx.Vote: showOnGoingVote :: [(PlayerNumber, Maybe Bool)] -> RuleNumber -> UTCTime -> NomexNE String

Files

Nomyx-Language.cabal view
@@ -1,5 +1,5 @@ name: Nomyx-Language-version: 0.7.3+version: 0.7.4 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)
src/Language/Nomyx/Examples.hs view
@@ -10,7 +10,8 @@    nothing,    helloWorld,    accounts,-   createBankAccount,+   createBankAccounts,+   displayBankAccounts,    winXEcuPerDay,    winXEcuOnRuleAccepted,    moneyTransfer,@@ -34,7 +35,6 @@    gameMaster,    bravoButton,    enterHaiku,-   displayBankAccount,    helloButton,    module X) where @@ -62,12 +62,12 @@ accounts = msgVar "Accounts"  -- | Create a bank account for each players-createBankAccount :: Rule-createBankAccount = void $ createValueForEachPlayer_ accounts+createBankAccounts :: Rule+createBankAccounts = void $ createValueForEachPlayer_ accounts  -- | Permanently display the bank accounts-displayBankAccount :: Rule-displayBankAccount = do+displayBankAccounts :: Rule+displayBankAccounts = do    let displayOneAccount (account_pn, a) = do         name <- showPlayer account_pn         return $ name ++ "\t" ++ show a ++ "\n"
src/Language/Nomyx/Rules.hs view
@@ -19,7 +19,7 @@    addRule, addRule_, addRule',    getFreeRuleNumber,    suppressRule, suppressRule_, suppressAllRules,-   modifyRule,+   proposeRule, modifyRule,    autoActivate,    activateOrRejectRule,    simulate,@@ -112,6 +112,10 @@  modifyRule :: RuleNumber -> RuleInfo -> Nomex Bool modifyRule rn r = ModifyRule rn r++-- | propose a rule that will need to be voted on.+proposeRule :: RuleInfo -> Nomex Bool+proposeRule = ProposeRule  -- | allows a rule to retrieve its own number (for auto-deleting for example)
 getSelfRuleNumber :: NomexNE RuleNumber
src/Language/Nomyx/Vote.hs view
@@ -23,6 +23,7 @@ import Control.Applicative import Control.Shortcut
 import Data.List+import System.Locale import qualified Data.Map as M  -- | a vote assessing function (such as unanimity, majority...)@@ -35,9 +36,30 @@                              voteFinished   :: Bool}                              deriving (Show, Typeable) +-- | information broadcasted when a vote begins+data VoteBegin = VoteBegin { vbRule        :: RuleInfo,+                             vbEndAt       :: UTCTime,+                             vbEventNumber :: EventNumber }+                             deriving (Show, Eq, Ord, Typeable)++-- | information broadcasted when a vote ends+data VoteEnd = VoteEnd { veRule   :: RuleInfo,+                         veVotes  :: [(PlayerNumber, Maybe Bool)],+                         vePassed :: Bool,+                         veFinishedAt :: UTCTime}+                         deriving (Show, Eq, Ord, Typeable)++voteBegin :: Msg VoteBegin+voteBegin = Msg "VoteBegin"++voteEnd :: Msg VoteEnd+voteEnd = Msg "VoteEnd"+ -- | vote at unanimity every incoming rule unanimityVote :: Nomex ()-unanimityVote = onRuleProposed $ callVoteRule unanimity oneDay+unanimityVote = do+   onRuleProposed $ callVoteRule unanimity oneDay+   displayVotes  -- | call a vote on a rule for every players, with an assessing function and a delay callVoteRule :: AssessFunction -> NominalDiffTime -> RuleInfo -> Nomex ()@@ -46,23 +68,25 @@    callVoteRule' assess endTime ri  callVoteRule' :: AssessFunction -> UTCTime -> RuleInfo -> Nomex ()-callVoteRule' assess endTime ri = callVote assess endTime (_rName ri) (_rNumber ri) (finishVote assess ri)+callVoteRule' assess endTime ri = do+   en <- callVote assess endTime (_rName ri) (_rNumber ri) (finishVote assess ri)+   sendMessage voteBegin (VoteBegin ri endTime en)  -- | 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-+   end <- liftEffect getCurrentTime+   sendMessage voteEnd (VoteEnd ri vs passed end)  -- | call a vote for every players, with an assessing function, a delay and a function to run on the result-callVote :: AssessFunction -> UTCTime -> String -> RuleNumber -> ([(PlayerNumber, Maybe Bool)] -> Nomex ()) -> Nomex ()+callVote :: AssessFunction -> UTCTime -> String -> RuleNumber -> ([(PlayerNumber, Maybe Bool)] -> Nomex ()) -> Nomex EventNumber callVote assess endTime name rn payload = do    let title = "Vote for rule: \"" ++ name ++ "\" (#" ++ (show rn) ++ "):"-   en <- onEventOnce (voteWith endTime assess title) payload-   displayVote en rn+   onEventOnce (voteWith endTime assess title) payload + -- | vote with a function able to assess the ongoing votes. -- | the vote can be concluded as soon as the result is known. voteWith :: UTCTime -> AssessFunction -> String -> Event [(PlayerNumber, Maybe Bool)]@@ -74,6 +98,12 @@    (vs, _)<- shortcut2b voteEvents timerEvent isFinished    return $ zip pns vs +-- | display the votes (ongoing and finished)+displayVotes :: Nomex ()+displayVotes = do+   void $ onMessage voteEnd displayFinishedVote+   void $ onMessage voteBegin displayOnGoingVote+ -- 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@@ -131,13 +161,14 @@ notVoted    vs = (nbParticipants vs) - (voted vs) voted       vs = M.findWithDefault 0 True (voteCounts vs) + M.findWithDefault 0 False (voteCounts vs) -displayVote :: EventNumber -> RuleNumber -> Nomex ()-displayVote en rn = void $ outputAll $ do+-- | display an on going vote+displayOnGoingVote :: VoteBegin -> Nomex ()+displayOnGoingVote (VoteBegin ri endTime en) = void $ outputAll $ do    mds <- getIntermediateResults en    let mbs = map getBooleanResult <$> mds    pns <- getAllPlayerNumbers    case mbs of-      Just bs -> showOnGoingVote (getVotes pns bs) rn+      Just bs -> showOnGoingVote (getVotes pns bs) (_rNumber ri) endTime       Nothing -> return ""  getVotes :: [PlayerNumber] -> [(PlayerNumber, Bool)] -> [(PlayerNumber, Maybe Bool)]@@ -152,14 +183,20 @@    Just a  -> (pn, a)    Nothing -> error "incorrect vote field" -showOnGoingVote :: [(PlayerNumber, Maybe Bool)] -> RuleNumber -> NomexNE String-showOnGoingVote [] rn = return $ "Votes for rule #" ++ (show rn) ++ ": Nobody voted yet"-showOnGoingVote listVotes rn = do+showOnGoingVote :: [(PlayerNumber, Maybe Bool)] -> RuleNumber -> UTCTime -> NomexNE String+showOnGoingVote [] rn _ = return $ "Nobody voted yet for rule #" ++ (show rn) ++ "."+showOnGoingVote listVotes rn endTime = do    list <- mapM showVote listVotes-   return $ "Votes for rule #" ++ (show rn) ++ ":" ++ "\n" ++ concatMap (\(name, vote) -> name ++ "\t" ++ vote ++ "\n") list+   let timeString = formatTime defaultTimeLocale "on %d/%m at %H:%M UTC" endTime+   return $ "Votes for rule #" ++ (show rn) ++ ", finishing " ++ timeString ++ "\n" +++            concatMap (\(name, vote) -> name ++ "\t" ++ vote ++ "\n") list -showFinishedVote :: RuleNumber -> Bool -> [(PlayerNumber, Maybe Bool)] -> NomexNE String-showFinishedVote rn passed l = do+-- | display a finished vote+displayFinishedVote :: VoteEnd -> Nomex ()+displayFinishedVote (VoteEnd ri vs passed end) = void $ outputAll $ showFinishedVote (_rNumber ri) passed vs end++showFinishedVote :: RuleNumber -> Bool -> [(PlayerNumber, Maybe Bool)] -> UTCTime -> NomexNE String+showFinishedVote rn passed l _ = do    let title = "Vote finished for rule #" ++ (show rn) ++ ", passed: " ++ (show passed)    let voted = filter (\(_, r) -> isJust r) l    votes <- mapM showVote voted