module Barber where

import Probability (Dist, RDist, Trans, normal)
import Queuing (Time, System, unit, evalSystem, idleAvgP, waiting)

-- * barber shop

custServ :: Dist Time
custServ = normal [5..10]

nextCust :: Trans Time -- not dependant on serving time
nextCust _ = normal [3..6]

barbers :: Int
barbers = 1

customers :: Int
customers = 20

runs :: Int
runs = 50

barberEvent :: ((), (Dist Time, Time -> Dist Time))
barberEvent =  unit (custServ, nextCust)

barberEvents :: [((), (Dist Time, Time -> Dist Time))]
barberEvents = replicate customers barberEvent

barberSystem :: (System () -> b) -> RDist b
barberSystem eval = evalSystem runs barbers barberEvents eval


-- * category

data Category = ThreeOrLess | FourToTen | MoreThanTen
	deriving (Eq,Ord,Show)

cat :: Time -> Category
cat n | n <= 3 = ThreeOrLess
cat n | n <= 10 = FourToTen
cat _ = MoreThanTen

perc :: Float -> String
perc n | n <= 0.25 = "0% to 25%"
perc n | n <= 0.5 = "25% to 50%"
perc n | n <= 0.75 = "50% to 75%"
perc _ = "75% to 100%"

-- * evaluation

-- | avg barber idle time
barberIdle :: RDist String
barberIdle = barberSystem (perc.(idleAvgP barbers))
-- | avg customer waiting time (unserved customers)
customerWait :: RDist Category
customerWait = barberSystem ( cat.(`div` customers).(waiting barbers) )