Nomyx-Language 0.7.2 → 0.7.3
raw patch · 6 files changed
+113/−88 lines, 6 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Language.Nomyx.Events: baseEvent :: Typeable a => Field a -> Event a
- Language.Nomyx.Events: baseInputEvent :: Typeable a => PlayerNumber -> String -> (InputForm a) -> Field a
- Language.Nomyx.Expression: BaseEvent :: Field a -> Event a
- Language.Nomyx.Expression: FieldResult :: Field e -> e -> Maybe FieldAddress -> FieldResult
- Language.Nomyx.Expression: SomeField :: (Field a) -> SomeField
- Language.Nomyx.Expression: _fieldAddress :: FieldResult -> Maybe FieldAddress
- Language.Nomyx.Expression: data Field a
- Language.Nomyx.Expression: data FieldAddressElem
- Language.Nomyx.Expression: data FieldResult
- Language.Nomyx.Expression: data SomeField
- Language.Nomyx.Expression: field :: FieldResult -> Field e
- Language.Nomyx.Expression: fieldAddress :: Lens FieldResult (Maybe FieldAddress)
- Language.Nomyx.Expression: fieldResult :: FieldResult -> e
- Language.Nomyx.Expression: instance Constructor C1_0FieldAddressElem
- Language.Nomyx.Expression: instance Constructor C1_1FieldAddressElem
- Language.Nomyx.Expression: instance Constructor C1_2FieldAddressElem
- Language.Nomyx.Expression: instance Constructor C1_3FieldAddressElem
- Language.Nomyx.Expression: instance Constructor C1_4FieldAddressElem
- Language.Nomyx.Expression: instance Constructor C1_5FieldAddressElem
- Language.Nomyx.Expression: instance Constructor C1_6FieldAddressElem
- Language.Nomyx.Expression: instance Datatype D1FieldAddressElem
- Language.Nomyx.Expression: instance Eq (Field e)
- Language.Nomyx.Expression: instance Eq FieldAddressElem
- Language.Nomyx.Expression: instance Generic FieldAddressElem
- Language.Nomyx.Expression: instance Ord FieldAddressElem
- Language.Nomyx.Expression: instance Read FieldAddressElem
- Language.Nomyx.Expression: instance Show (Field a)
- Language.Nomyx.Expression: instance Show FieldAddressElem
- Language.Nomyx.Expression: instance Show FieldResult
- Language.Nomyx.Expression: instance Show SomeField
- Language.Nomyx.Expression: instance Typeable Field
- Language.Nomyx.Expression: type FieldAddress = [FieldAddressElem]
+ Language.Nomyx.Events: inputFormSignal :: Typeable a => PlayerNumber -> String -> (InputForm a) -> Signal a
+ Language.Nomyx.Events: signalEvent :: Typeable a => Signal a -> Event a
+ Language.Nomyx.Expression: SignalData :: Signal e -> e -> SignalData
+ Language.Nomyx.Expression: SignalEvent :: Signal a -> Event a
+ Language.Nomyx.Expression: SignalOccurence :: SignalData -> SignalAddress -> SignalOccurence
+ Language.Nomyx.Expression: SomeSignal :: (Signal a) -> SomeSignal
+ Language.Nomyx.Expression: _signalOccAddress :: SignalOccurence -> SignalAddress
+ Language.Nomyx.Expression: _signalOccData :: SignalOccurence -> SignalData
+ Language.Nomyx.Expression: data Signal a
+ Language.Nomyx.Expression: data SignalAddressElem
+ Language.Nomyx.Expression: data SignalData
+ Language.Nomyx.Expression: data SignalOccurence
+ Language.Nomyx.Expression: data SomeSignal
+ Language.Nomyx.Expression: instance Constructor C1_0SignalAddressElem
+ Language.Nomyx.Expression: instance Constructor C1_1SignalAddressElem
+ Language.Nomyx.Expression: instance Constructor C1_2SignalAddressElem
+ Language.Nomyx.Expression: instance Constructor C1_3SignalAddressElem
+ Language.Nomyx.Expression: instance Constructor C1_4SignalAddressElem
+ Language.Nomyx.Expression: instance Constructor C1_5SignalAddressElem
+ Language.Nomyx.Expression: instance Constructor C1_6SignalAddressElem
+ Language.Nomyx.Expression: instance Datatype D1SignalAddressElem
+ Language.Nomyx.Expression: instance Eq (Signal e)
+ Language.Nomyx.Expression: instance Eq SignalAddressElem
+ Language.Nomyx.Expression: instance Generic SignalAddressElem
+ Language.Nomyx.Expression: instance Ord SignalAddressElem
+ Language.Nomyx.Expression: instance Read SignalAddressElem
+ Language.Nomyx.Expression: instance Show (Signal a)
+ Language.Nomyx.Expression: instance Show SignalAddressElem
+ Language.Nomyx.Expression: instance Show SignalData
+ Language.Nomyx.Expression: instance Show SignalOccurence
+ Language.Nomyx.Expression: instance Show SomeSignal
+ Language.Nomyx.Expression: instance Typeable Signal
+ Language.Nomyx.Expression: signal :: SignalData -> Signal e
+ Language.Nomyx.Expression: signalData :: SignalData -> e
+ Language.Nomyx.Expression: signalOccAddress :: Lens SignalOccurence SignalAddress
+ Language.Nomyx.Expression: signalOccData :: Lens SignalOccurence SignalData
+ Language.Nomyx.Expression: type SignalAddress = [SignalAddressElem]
+ Language.Nomyx.Players: getPlayerName' :: PlayerNumber -> NomexNE PlayerName
- Language.Nomyx.Expression: AppL :: FieldAddressElem
+ Language.Nomyx.Expression: AppL :: SignalAddressElem
- Language.Nomyx.Expression: AppR :: FieldAddressElem
+ Language.Nomyx.Expression: AppR :: SignalAddressElem
- Language.Nomyx.Expression: BindL :: FieldAddressElem
+ Language.Nomyx.Expression: BindL :: SignalAddressElem
- Language.Nomyx.Expression: BindR :: FieldAddressElem
+ Language.Nomyx.Expression: BindR :: SignalAddressElem
- Language.Nomyx.Expression: EventInfo :: EventNumber -> RuleNumber -> Event e -> EventHandler e -> Status -> [FieldResult] -> EventInfo
+ Language.Nomyx.Expression: EventInfo :: EventNumber -> RuleNumber -> Event e -> EventHandler e -> Status -> [SignalOccurence] -> EventInfo
- Language.Nomyx.Expression: Input :: PlayerNumber -> String -> (InputForm a) -> Field a
+ Language.Nomyx.Expression: Input :: PlayerNumber -> String -> (InputForm a) -> Signal a
- Language.Nomyx.Expression: Message :: Msg a -> Field a
+ Language.Nomyx.Expression: Message :: Msg a -> Signal a
- Language.Nomyx.Expression: Player :: Player -> Field PlayerInfo
+ Language.Nomyx.Expression: Player :: Player -> Signal PlayerInfo
- Language.Nomyx.Expression: RuleEv :: RuleEvent -> Field RuleInfo
+ Language.Nomyx.Expression: RuleEv :: RuleEvent -> Signal RuleInfo
- Language.Nomyx.Expression: Shortcut :: FieldAddressElem
+ Language.Nomyx.Expression: Shortcut :: SignalAddressElem
- Language.Nomyx.Expression: SumL :: FieldAddressElem
+ Language.Nomyx.Expression: SumL :: SignalAddressElem
- Language.Nomyx.Expression: SumR :: FieldAddressElem
+ Language.Nomyx.Expression: SumR :: SignalAddressElem
- Language.Nomyx.Expression: Time :: UTCTime -> Field UTCTime
+ Language.Nomyx.Expression: Time :: UTCTime -> Signal UTCTime
- Language.Nomyx.Expression: Victory :: Field VictoryInfo
+ Language.Nomyx.Expression: Victory :: Signal VictoryInfo
- Language.Nomyx.Expression: _env :: EventInfo -> [FieldResult]
+ Language.Nomyx.Expression: _env :: EventInfo -> [SignalOccurence]
- Language.Nomyx.Expression: env :: Lens EventInfo [FieldResult]
+ Language.Nomyx.Expression: env :: Lens EventInfo [SignalOccurence]
Files
- Nomyx-Language.cabal +1/−1
- src/Language/Nomyx.hs +3/−3
- src/Language/Nomyx/Events.hs +34/−22
- src/Language/Nomyx/Expression.hs +50/−45
- src/Language/Nomyx/Inputs.hs +15/−15
- src/Language/Nomyx/Players.hs +10/−2
Nomyx-Language.cabal view
@@ -1,5 +1,5 @@ name: Nomyx-Language-version: 0.7.2+version: 0.7.3 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.hs view
@@ -2,16 +2,15 @@ -- | This module re-exports the elements necessary to compose a Nomyx rule. module Language.Nomyx (- module Language.Nomyx.Expression, module Language.Nomyx.Outputs, module Language.Nomyx.Inputs, module Language.Nomyx.Events, module Language.Nomyx.Players, module Language.Nomyx.Variables, module Language.Nomyx.Rules,- module Language.Nomyx.Vote) where+ module Language.Nomyx.Vote,+ module Language.Nomyx.Expression) where -import Language.Nomyx.Expression -- Nomyx Expression DSL import Language.Nomyx.Outputs -- create outputs import Language.Nomyx.Inputs -- create inputs import Language.Nomyx.Events -- create events@@ -19,3 +18,4 @@ import Language.Nomyx.Variables -- create variables import Language.Nomyx.Rules -- manage rules import Language.Nomyx.Vote -- create votations+import Language.Nomyx.Expression -- Nomyx Expression DSL
src/Language/Nomyx/Events.hs view
@@ -12,7 +12,7 @@ getCurrentTime, oneWeek, oneDay, oneHour, oneMinute, timeEvent, messageEvent, victoryEvent, playerEvent, ruleEvent,- baseEvent, baseInputEvent,+ signalEvent, inputFormSignal, liftEvent ) where @@ -60,8 +60,8 @@ Just ev -> return $ Just $ mapMaybe getInputResult (_env ev) Nothing -> return Nothing -getInputResult :: FieldResult -> Maybe (PlayerNumber, SomeData)-getInputResult (FieldResult (Input pn _ _) r _) = Just (pn, SomeData r)+getInputResult :: SignalOccurence -> Maybe (PlayerNumber, SomeData)+getInputResult (SignalOccurence (SignalData (Input pn _ _) r) _) = Just (pn, SomeData r) getInputResult _ = Nothing -- | broadcast a message that can be catched by another rule @@ -116,37 +116,49 @@ schedule'_ :: [UTCTime] -> Nomex () -> Nomex () schedule'_ ts f = schedule' ts (const f) - ++-- | get the current time as UTCTime getCurrentTime :: NomexNE UTCTime getCurrentTime = CurrentTime --- | duration-oneWeek, oneDay, oneHour, oneMinute :: NominalDiffTime -oneWeek = 7 * oneDay-oneDay = 24 * oneHour-oneHour = 60 * oneMinute-oneMinute = 60--baseEvent :: (Typeable a) => Field a -> Event a-baseEvent = BaseEvent+-- * Individual events +-- | Build an event firing at a specific time timeEvent :: UTCTime -> Event UTCTime-timeEvent = BaseEvent . Time--messageEvent :: (Typeable a) => Msg a -> Event a-messageEvent = BaseEvent . Message+timeEvent = SignalEvent . Time +-- | Build a event firing when the victory condition is changed victoryEvent :: Event VictoryInfo-victoryEvent = BaseEvent Victory+victoryEvent = SignalEvent Victory +-- | Build a event firing when a player arrives or leaves playerEvent :: Player -> Event PlayerInfo-playerEvent = BaseEvent . Player+playerEvent = SignalEvent . Player +-- | Build a event firing when an action is made on a rule ruleEvent :: RuleEvent -> Event RuleInfo-ruleEvent re = BaseEvent $ RuleEv re+ruleEvent re = SignalEvent $ RuleEv re -baseInputEvent :: (Typeable a) => PlayerNumber -> String -> (InputForm a) -> Field a-baseInputEvent pn s iform = Input pn s iform+-- | Build a message event, that can be intercepted by another rule+-- this is useful for message-passing style of communication+messageEvent :: (Typeable a) => Msg a -> Event a+messageEvent = SignalEvent . Message +-- | Build a event firing immediatly, yelding the value of the NomexNE liftEvent :: NomexNE a -> Event a liftEvent = LiftEvent++-- | duration+oneWeek, oneDay, oneHour, oneMinute :: NominalDiffTime +oneWeek = 7 * oneDay+oneDay = 24 * oneHour+oneHour = 60 * oneMinute+oneMinute = 60++-- * internals++inputFormSignal :: (Typeable a) => PlayerNumber -> String -> (InputForm a) -> Signal a+inputFormSignal pn s iform = Input pn s iform++signalEvent :: (Typeable a) => Signal a -> Event a+signalEvent = SignalEvent
src/Language/Nomyx/Expression.hs view
@@ -12,7 +12,7 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE DeriveGeneric #-} --- | This module containt the type definitions necessary to build a Nomic rule. +-- | This module contains the type definitions necessary to build a Nomic rule. module Language.Nomyx.Expression where import Data.Typeable @@ -46,10 +46,10 @@ type NoEffect = 'NoEffect -- | A Nomex (Nomyx Expression) allows the players to write rules.--- within the rules, you can access and modify the state of the game.+-- Within the rules, you can access and modify the state of the game. type Nomex = Exp Effect --- | A NomexNE (Nomyx Expression No Effect) is a specialisation of the type that guaranties+-- | A NomexNE (Nomyx Expression No Effect) is a specialisation of the type that guarantees -- that the instructions will have no effects. type NomexNE = Exp NoEffect @@ -98,16 +98,26 @@ deriving instance Typeable Exp deriving instance Typeable 'Effect deriving instance Typeable 'NoEffect++instance Typeable a => Show (Exp NoEffect a) where + show _ = "<" ++ (show $ typeRep (Proxy :: Proxy a)) ++ ">" ++instance Typeable a => Show (Exp Effect a) where + show _ = "<" ++ (show $ typeRep (Proxy :: Proxy a)) ++ ">" + #else instance Typeable1 (Exp NoEffect) where typeOf1 _ = mkTyConApp (mkTyCon3 "main" "Language.Nomyx.Expression" "Exp NoEffect") [] instance Typeable1 (Exp Effect) where typeOf1 _ = mkTyConApp (mkTyCon3 "main" "Language.Nomyx.Expression" "Exp Effect") []-#endif -liftEffect :: NomexNE a -> Nomex a-liftEffect = LiftEffect +instance Typeable a => Show (Exp NoEffect a) where + show e = "<" ++ (show $ typeOf e) ++ ">" ++instance Typeable a => Show (Exp Effect a) where + show e = "<" ++ (show $ typeOf e) ++ ">" +#endif instance Monad (Exp a) where return = Return @@ -127,22 +137,8 @@ throwError = ThrowError catchError = CatchError -instance Typeable a => Show (Exp NoEffect a) where -#if __GLASGOW_HASKELL__ < 708- show e = "<" ++ (show $ typeOf e) ++ ">" -#else- show e = "<" ++ (show $ typeRep (Proxy :: Proxy a)) ++ ">" -#endif--instance Typeable a => Show (Exp Effect a) where -#if __GLASGOW_HASKELL__ < 708- show e = "<" ++ (show $ typeOf e) ++ ">" -#else- show e = "<" ++ (show $ typeRep (Proxy :: Proxy a)) ++ ">" -#endif- -instance (Typeable a, Typeable b) => Show (a -> b) where- show e = '<' : (show . typeOf) e ++ ">"+liftEffect :: NomexNE a -> Nomex a+liftEffect = LiftEffect -- * Variables @@ -159,22 +155,22 @@ EmptyEvent :: Event a -- An event that is never fired. BindEvent :: Event a -> (a -> Event b) -> Event b -- A First event should fire, then a second event is constructed ShortcutEvents :: [Event a] -> ([Maybe a] -> Bool) -> Event [Maybe a] -- Return the intermediate results as soon as the function evaluates to True, dismissing the events that hasn't fired yet- BaseEvent :: (Typeable a) => Field a -> Event a -- Embed a base event+ SignalEvent :: (Typeable a) => Signal a -> Event a -- Embed a single Signal as an Event LiftEvent :: NomexNE a -> Event a -- create an event containing the result of the NomexNE. deriving Typeable --- | Base events-data Field a where- Input :: PlayerNumber -> String -> (InputForm a) -> Field a- Player :: Player -> Field PlayerInfo- RuleEv :: RuleEvent -> Field RuleInfo- Time :: UTCTime -> Field UTCTime- Message :: Msg a -> Field a- Victory :: Field VictoryInfo+-- | Signals+data Signal a where+ Input :: PlayerNumber -> String -> (InputForm a) -> Signal a+ Player :: Player -> Signal PlayerInfo+ RuleEv :: RuleEvent -> Signal RuleInfo+ Time :: UTCTime -> Signal UTCTime+ Message :: Msg a -> Signal a+ Victory :: Signal VictoryInfo deriving Typeable -- | Type agnostic base event-data SomeField = forall a. (Typeable a) => SomeField (Field a)+data SomeSignal = forall a. (Typeable a) => SomeSignal (Signal a) -- | Type agnostic result data data SomeData = forall e. (Typeable e, Show e) => SomeData e@@ -195,9 +191,9 @@ deriving Typeable deriving instance Show (InputForm a)-deriving instance Show (Field a)-deriving instance Show SomeField-deriving instance Eq (Field e)+deriving instance Show (Signal a)+deriving instance Show SomeSignal+deriving instance Eq (Signal e) deriving instance Eq (InputForm e) deriving instance Eq (Msg e) @@ -231,19 +227,22 @@ event :: Event e, handler :: EventHandler e, _evStatus :: Status,- _env :: [FieldResult]}+ _env :: [SignalOccurence]} -data FieldAddressElem = SumR | SumL | AppR | AppL | BindR | BindL | Shortcut deriving (Show, Read, Ord, Eq, Generic)-type FieldAddress = [FieldAddressElem]+data SignalAddressElem = SumR | SumL | AppR | AppL | BindR | BindL | Shortcut deriving (Show, Read, Ord, Eq, Generic)+type SignalAddress = [SignalAddressElem] -data FieldResult = forall e. (Typeable e, Show e) =>- FieldResult {field :: Field e,- fieldResult :: e,- _fieldAddress :: Maybe FieldAddress}+data SignalData = forall e. (Typeable e, Show e) =>+ SignalData {signal :: Signal e,+ signalData :: e} +data SignalOccurence = SignalOccurence {_signalOccData :: SignalData,+ _signalOccAddress :: SignalAddress}+ type EventHandler e = (EventNumber, e) -> Nomex () -deriving instance Show FieldResult+deriving instance Show SignalData+deriving instance Show SignalOccurence data Status = SActive | SDeleted deriving (Eq, Show) @@ -260,7 +259,7 @@ type Rule = Nomex () -- | An informationnal structure about a rule -data RuleInfo = RuleInfo { _rNumber :: RuleNumber, -- number of the rule (must be unique) TO CHECK +data RuleInfo = RuleInfo { _rNumber :: RuleNumber, -- number of the rule (must be unique) _rName :: RuleName, -- short name of the rule _rDescription :: String, -- description of the rule _rProposedBy :: PlayerNumber, -- player proposing the rule @@ -299,6 +298,8 @@ _vCond :: NomexNE [PlayerNumber]} deriving (Show, Typeable) +-- * Miscellaneous+ partial :: String -> Nomex (Maybe a) -> Nomex a partial s nm = do m <- nm@@ -308,6 +309,10 @@ concatMapM :: (Monad m) => (a -> m [b]) -> [a] -> m [b] concatMapM f xs = liftM concat (mapM f xs) + +instance (Typeable a, Typeable b) => Show (a -> b) where+ show e = '<' : (show . typeOf) e ++ ">" -$( makeLenses [''RuleInfo, ''PlayerInfo, ''EventInfo, ''FieldResult] ) ++$( makeLenses [''RuleInfo, ''PlayerInfo, ''EventInfo, ''SignalOccurence] )
src/Language/Nomyx/Inputs.hs view
@@ -26,7 +26,7 @@ -- | event based on a radio input choice inputRadio :: (Eq c, Show c, Typeable c) => PlayerNumber -> String -> [(c, String)] -> Event c -inputRadio pn title cs = baseEvent $ baseInputRadio pn title cs+inputRadio pn title cs = signalEvent $ inputRadioSignal pn title cs inputRadio' :: (Eq c, Show c, Typeable c) => PlayerNumber -> String -> [c] -> Event c inputRadio' pn title cs = inputRadio pn title (zip cs (show <$> cs))@@ -47,7 +47,7 @@ -- | event based on a text input inputText :: PlayerNumber -> String -> Event String -inputText pn title = baseEvent $ baseInputText pn title+inputText pn title = signalEvent $ inputTextSignal pn title -- | triggers a string input to the user. The result will be sent to the callback onInputText :: String -> (EventNumber -> String -> Nomex ()) -> PlayerNumber -> Nomex EventNumber @@ -66,7 +66,7 @@ -- | event based on a checkbox input inputCheckbox :: (Eq c, Show c, Typeable c) => PlayerNumber -> String -> [(c, String)] -> Event [c] -inputCheckbox pn title cs = baseEvent $ baseInputCheckbox pn title cs+inputCheckbox pn title cs = signalEvent $ inputCheckboxSignal pn title cs onInputCheckbox :: (Typeable a, Eq a, Show a) => String -> [(a, String)] -> (EventNumber -> [a] -> Nomex ()) -> PlayerNumber -> Nomex EventNumber onInputCheckbox title choices handler pn = onEvent (inputCheckbox pn title choices) (\(en, a) -> handler en a) @@ -81,7 +81,7 @@ -- | event based on a button inputButton :: PlayerNumber -> String -> Event () -inputButton pn title = baseEvent $ baseInputButton pn title+inputButton pn title = signalEvent $ inputButtonSignal pn title onInputButton :: String -> (EventNumber -> () -> Nomex ()) -> PlayerNumber -> Nomex EventNumber onInputButton title handler pn = onEvent (inputButton pn title) (\(en, ()) -> handler en ()) @@ -97,7 +97,7 @@ -- | event based on a text area inputTextarea :: PlayerNumber -> String -> Event String -inputTextarea pn title = baseEvent $ baseInputTextarea pn title+inputTextarea pn title = signalEvent $ inputTextareaSignal pn title onInputTextarea :: String -> (EventNumber -> String -> Nomex ()) -> PlayerNumber -> Nomex EventNumber onInputTextarea title handler pn = onEvent (inputTextarea pn title) (\(en, a) -> handler en a) @@ -112,17 +112,17 @@ -- ** Internals -baseInputRadio :: (Eq c, Show c, Typeable c) => PlayerNumber -> String -> [(c, String)] -> Field c -baseInputRadio pn title cs = baseInputEvent pn title (Radio cs)+inputRadioSignal :: (Eq c, Show c, Typeable c) => PlayerNumber -> String -> [(c, String)] -> Signal c +inputRadioSignal pn title cs = inputFormSignal pn title (Radio cs) -baseInputText :: PlayerNumber -> String -> Field String -baseInputText pn title = baseInputEvent pn title Text+inputTextSignal :: PlayerNumber -> String -> Signal String +inputTextSignal pn title = inputFormSignal pn title Text -baseInputCheckbox :: (Eq c, Show c, Typeable c) => PlayerNumber -> String -> [(c, String)] -> Field [c] -baseInputCheckbox pn title cs = baseInputEvent pn title (Checkbox cs) +inputCheckboxSignal :: (Eq c, Show c, Typeable c) => PlayerNumber -> String -> [(c, String)] -> Signal [c] +inputCheckboxSignal pn title cs = inputFormSignal pn title (Checkbox cs) -baseInputButton :: PlayerNumber -> String -> Field () -baseInputButton pn title = baseInputEvent pn title Button+inputButtonSignal :: PlayerNumber -> String -> Signal () +inputButtonSignal pn title = inputFormSignal pn title Button -baseInputTextarea :: PlayerNumber -> String -> Field String -baseInputTextarea pn title = baseInputEvent pn title TextArea+inputTextareaSignal :: PlayerNumber -> String -> Signal String +inputTextareaSignal pn title = inputFormSignal pn title TextArea
src/Language/Nomyx/Players.hs view
@@ -14,7 +14,7 @@ Player(..), playerEvent, playerNumber, playerName,- getPlayers, getPlayer, getPlayerName, + getPlayers, getPlayer, getPlayerName, getPlayerName', setPlayerName, modifyPlayerName, getPlayersNumber, getAllPlayerNumbers, @@ -54,11 +54,19 @@ pls <- GetPlayers return $ find ((== pn) . getL playerNumber) pls --- | Set the name of a player +-- | Get the name of a player getPlayerName :: PlayerNumber -> NomexNE (Maybe PlayerName) getPlayerName pn = do p <- getPlayer pn return $ _playerName <$> p ++-- | Get the name of a player, his number if not found +getPlayerName' :: PlayerNumber -> NomexNE PlayerName +getPlayerName' pn = do + mp <- getPlayer pn+ return $ case mp of+ Just p -> _playerName p+ Nothing -> "Player " ++ (show pn) -- | Set the name of a player setPlayerName :: PlayerNumber -> PlayerName -> Nomex Bool