
	Haskell: The Craft of Functional Programming
	Simon Thompson
	(c) Addison-Wesley, 1999.

	The top level of the server simulation.

>	module TopLevelServe where

>	import Base		-- for the base types of the system
>	import QueueState	-- for the queue type
>	import ServerState	-- for the server type
>	import RandomGen	-- for the random inputs


The top-level simulation is a function from a series of input 
messages to a series of output messages, so

>	doSimulation :: ServerState -> [Inmess] -> [Outmess]

>	doSimulation servSt (im:messes)
>	  = outmesses ++ doSimulation servStNext messes
>	    where
>	    (servStNext , outmesses) = simulationStep servSt im

How do we generate an input sequence? From RandomGen we have the
sequence of times given by randomTimes

>	simulationInput :: [Inmess] 

>	simulationInput = zipWith Yes [1 .. ] randomTimes

The output generated by the sample input.

>	simEx :: [Outmess]

>	simEx = doSimulation serverStart simulationInput

	= [Discharge 1 0 2, Discharge 3 0 1, Discharge 6 0 1, 
	   Discharge 2 0 5, Discharge 5 0 3, Discharge 4 0 4,
	   Discharge 7 2 2,...

A `finite' input: infinite list with only a finite number of `interesting'
inputs.

>	simulationInput2 :: [Inmess] 

>	simulationInput2 = take 50 simulationInput ++ noes

>	noes = No : noes

A finite list of outputs, corresponding to the `finite' list of inputs given by
simulationInput2

>	simEx2 :: [Outmess]

>	simEx2 = take 50 (doSimulation serverStart simulationInput2)

Total waiting time on all the queues

>	totalWait :: [Outmess] -> Int
>	totalWait = sum . map waitTime
>	            where
>	            waitTime (Discharge _ w _) = w

Total wait in the second example.

>	totalWaitEx2 = totalWait simEx2


