module Controller.Menu.Statistics.FrequencyDistribution (eventHandler) where import Control.Monad (forM_) import Data.List (nub) import Controller (Controller,onGridView) import View.Component.Grid (getColumnValues) import Util (justWhen) import qualified Controller.Grid as Grid import Controller.Canonical (addRow) import Controller.Menu.Table.Add (addColumn) import Controller.Dialog (chooseColumnDialog) import I18n (__) eventHandler :: Controller () eventHandler = do selection <- chooseColumnDialog $ __ "Frequency Distribution" justWhen selection $ \colIndex -> do values <- onGridView $ getColumnValues colIndex Grid.new Nothing addColumn $ Just $ __ "Frequency" addColumn $ Just $ __ "Percentage" forM_ (freqDist values) $ \(value,freq,perc) -> do addRow (Just value,[show freq, show perc]) freqDist :: [String] -> [(String,Int,Double)] freqDist values = let unique = nub values frequency = map (\s -> length $ filter ((==) s) values) unique numValues = length values percentage = map (\f -> fromIntegral f / (fromIntegral numValues)) frequency in zip3 unique frequency percentage