Craft3e-0.1.0.2: Simulation/QueueState.hs
-------------------------------------------------------------------------
--
-- Haskell: The Craft of Functional Programming, 3e
-- Simon Thompson
-- (c) Addison-Wesley, 1996-2011.
--
-- The queue ADT: its signature is given in comments in the module
-- header.
--
-------------------------------------------------------------------------
module QueueState
( QueueState ,
addMessage, -- Inmess -> QueueState -> QueueState
queueStep, -- QueueState -> ( QueueState , [Outmess] )
queueStart, -- QueueState
queueLength, -- QueueState -> Int
queueEmpty -- QueueState -> Bool
) where
import Base -- for the base types of the system
type Time = Int
-- The implementation of the QueueState, where the first field gives the
-- current time, the second the service time so far for the item currently
-- being processed,
data QueueState = QS Time Service [Inmess]
deriving (Eq, Show)
-- To add a message, it is put at the end of the list of messages.
addMessage :: Inmess -> QueueState -> QueueState
addMessage im (QS time serv ml) = QS time serv (ml++[im])
-- A single step in the queue simulation.
queueStep :: QueueState -> ( QueueState , [Outmess] )
queueStep (QS time servSoFar (Yes arr serv : inRest))
| servSoFar < serv
= (QS (time+1) (servSoFar+1) (Yes arr serv : inRest) , [])
| otherwise
= (QS (time+1) 0 inRest , [Discharge arr (time-serv-arr) serv])
--
queueStep (QS time serv []) = (QS (time+1) serv [] , [])
-- The starting state
queueStart :: QueueState
queueStart = QS 0 0 []
-- The length of the queue
queueLength :: QueueState -> Int
queueLength (QS _ _ q) = length q
-- Is the queue empty?
queueEmpty :: QueueState -> Bool
queueEmpty (QS _ _ q) = (q==[])