module Data.List.HIUtils (
uniqSort
, aggregate, aggregateBy, aggregateAL
, nat0, nat1
, average , averageI
, relFreq, relFreqAL
, majority
, oddIx, evenIx
) where
import Data.List
import Data.Ord
import Control.Arrow
uniqSort :: (Ord a) => [a] -> [a]
uniqSort = map head . group . sort
prop_uniqSortIsNubSort :: [Int] -> Bool
prop_uniqSortIsNubSort a = uniqSort a == nub (sort a)
average :: (Fractional a) => [a] -> a
average xs = (sum xs) / (genericLength xs)
averageI :: (Integral i, Fractional a) => [i] -> a
averageI = average . map fromIntegral
relFreq :: (Integral i, Fractional f) => [i] -> [f]
relFreq items = map divide items
where divide nom = fromIntegral nom / s
s = fromIntegral (sum items)
relFreqAL :: (Integral i, Fractional f) => [(a, i)] -> [(a, f)]
relFreqAL items = map (second divide) items
where divide nom = fromIntegral nom / s
s = fromIntegral . sum . map snd $ items
aggregate :: (Ord a) => [a] -> [[a]]
aggregate = aggregateBy compare
aggregateBy :: (a -> a -> Ordering) -> [a] -> [[a]]
aggregateBy x = groupBy (\a b -> x a b == EQ) . sortBy x
aggregateAL :: (Ord a) => [(a,b)] -> [(a,[b])]
aggregateAL = map (fst . head &&& map snd) . aggregateBy (comparing fst)
majority :: (Ord a) => [a] -> a
majority = head . maximumBy (comparing length) . aggregate
nat0 :: (Num n) => [n]
nat0 = iterate (+1) 0
nat1 :: (Num n) => [n]
nat1 = iterate (+1) 1
oddIx = map snd . filter (odd . fst) . zip nat0
evenIx = map snd . filter (even . fst) . zip nat0