packages feed

codemonitor-0.2: src/Monitor.hs

module Monitor where

import Job.Types

data Monitor = StatusCodeMonitor
                { mJobId          :: String
                , mSecondsInState :: Double
                , mJobName        :: String
                , mJobStatus      :: Status
                , mOutput         :: String
                }
             | StdoutMonitor
                { mJobId          :: String
                , mSecondsInState :: Double
                , mJobName        :: String
                , mOutput         :: String
                }
             deriving (Show, Eq)

updateMonitors :: Double -> Jobs -> [Monitor] -> [Monitor]
updateMonitors secondsSinceLastUpdate jobs = map updateMonitor
    where
        updateMonitor monitor@(StatusCodeMonitor {}) =
            let newStatus  = status $ jobWithId jobs (mJobId monitor)
                newOutput  = output $ jobWithId jobs (mJobId monitor)
                newSeconds = if mJobStatus monitor == newStatus
                                then secondsSinceLastUpdate + mSecondsInState monitor
                                else 0
            in monitor { mSecondsInState = newSeconds
                       , mJobStatus      = newStatus
                       , mOutput         = newOutput
                       }
        updateMonitor monitor@(StdoutMonitor {}) =
            let newOutput  = output $ jobWithId jobs (mJobId monitor)
                newSeconds = secondsSinceLastUpdate + mSecondsInState monitor
            in monitor { mSecondsInState = newSeconds
                       , mOutput         = newOutput
                       }