packages feed

tkyprof-0.0.1: Model.hs

{-# LANGUAGE RecordWildCards #-}
module Model where
import ProfilingReport
import Data.Map (Map)
import qualified Data.Map as M
import Control.Applicative
import Control.Concurrent.STM

type ReportID = Integer

data Reports = Reports
  { newReportId :: TVar ReportID
  , reports     :: TVar (Map ReportID ProfilingReport)
  }

emptyReports :: STM Reports
emptyReports = do
  uid <- newTVar 0
  rs  <- newTVar M.empty
  return $ Reports { newReportId = uid
                   , reports     = rs }

insertReport :: ProfilingReport -> Reports -> STM ReportID
insertReport r Reports{..} = do
  uid <- readTVar newReportId
  rs  <- readTVar reports
  writeTVar newReportId (succ uid)
  writeTVar reports (M.insert uid r rs)
  return uid

deleteReport :: ReportID -> Reports -> STM ()
deleteReport i Reports{..} = do
  rs <- readTVar reports
  writeTVar reports (M.delete i rs)

lookupReport :: ReportID -> Reports -> STM (Maybe ProfilingReport)
lookupReport i Reports{..} = do
  rs <- readTVar reports
  return $ M.lookup i rs

memberReport :: ReportID -> Reports -> STM Bool
memberReport i Reports{..} = do
  rs <- readTVar reports
  return $ M.member i rs

allReports :: Reports -> STM [(ReportID, ProfilingReport)]
allReports (Reports _ rs) = M.toList <$> readTVar rs

allProfilingReports :: Reports -> STM [ProfilingReport]
allProfilingReports r = map snd <$> allReports r