{-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE BangPatterns #-} -- | -- Module : Average -- Copyright : (c) Vitaliy Rukavishnikov 2011 -- License : BSD-style (see the file LICENSE) -- -- Maintainer : virukav@gmail.com -- Stability : experimental -- Portability : non-portable -- -- Defines the class to calculate the average Sysmon report module Database.Sybase.Sysmon.Average where import Database.Sybase.Sysmon.LogTypes import Data.List import Data.IntervalMap.FingerTree class Averageable a where avg :: [a] -> a instance Averageable Int where avg = fst . foldl' (\(!m, !n) xs -> (m+(xs-m) `div` (n+1),n+1)) (0,0) instance Averageable Double where avg = fst . foldl' (\(!m, !n) xs -> (m+(xs-m)/(n+1),n+1)) (0,0) instance Averageable String where avg [] = "" avg xs = head xs instance Averageable LogInterval where avg xs = Interval s e where s = foldr1 min $ map low xs e = foldr1 max $ map high xs