packages feed

nomyx-language-1.0.0: src/Nomyx/Language/Outputs.hs

-- All the building blocks to allow rules to produce outputs.
-- for example, you can display a message like this:
-- do
--    outputAll_ "hello, world!"

module Nomyx.Language.Outputs (
   OutputNumber,
   newOutput, newOutput_,
   outputAll, outputAll_,
   getOutput, getOutput_,
   updateOutput,
   delOutput,
   displayVar, displayVar',
   displaySimpleVar
   ) where

import Nomyx.Language.Types
import Imprevu
import Data.Typeable
import Control.Monad.State


-- * Outputs

-- | outputs a message to one player, dynamic version
newOutput :: Maybe PlayerNumber -> Nomex String -> Nomex OutputNumber
newOutput = NewOutput

-- | outputs a message to one player, static version
newOutput_ :: Maybe PlayerNumber -> String -> Nomex OutputNumber
newOutput_ ns mpn = NewOutput ns (return mpn)

-- | output a message to all players
outputAll :: Nomex String -> Nomex OutputNumber
outputAll = newOutput Nothing

-- | output a constant message to all players
outputAll_ :: String -> Nomex ()
outputAll_ s = void $ newOutput Nothing (return s)

-- | get an output by number
getOutput :: OutputNumber -> Nomex (Maybe String)
getOutput = GetOutput

-- | get an output by number, partial version
getOutput_ :: OutputNumber -> Nomex String
getOutput_ on = partial "getOutput_ : Output number not existing" $ getOutput on

-- | update an output
updateOutput :: OutputNumber -> Nomex String -> Nomex Bool
updateOutput = UpdateOutput

-- | delete an output
delOutput :: OutputNumber -> Nomex Bool
delOutput = DelOutput

-- | display a variable
displayVar :: (Typeable a, Show a) => Maybe PlayerNumber -> V a -> (Maybe a -> Nomex String) -> Nomex OutputNumber
displayVar mpn mv dis = newOutput mpn $ readVar mv >>= dis

-- permanently display a variable
displayVar' :: (Typeable a, Show a) => Maybe PlayerNumber -> V a -> (a -> Nomex String) -> Nomex OutputNumber
displayVar' mpn mv dis = displayVar mpn mv dis' where
   dis' Nothing  = return $ "Variable " ++ (varName mv) ++ " deleted"
   dis' (Just a) = (++ "\n") <$> dis a

displaySimpleVar :: (Typeable a, Show a) => Maybe PlayerNumber -> V a -> String -> Nomex OutputNumber
displaySimpleVar mpn mv title = displayVar' mpn mv showVar where
   showVar a = return $ title ++ ": " ++ (show a) ++ "\n"