{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances #-} module Alphabetizer where import LineStorage import Word import Data.List import qualified Data.IntMap as IntMap class Alphabetizer s t r where sort_ :: (Word e, Ord e) => (s (t (r e))) -> (s (t (r e))) compareLines :: (Word e, Ord e) => [e] -> [e] -> Ordering compareLines [] _ = LT compareLines _ [] = GT compareLines (e1:e1s) (e2:e2s) | r == EQ = compareLines e1s e2s | otherwise = r where r = compareTo e1 e2 instance Alphabetizer StorageList StorageList StorageList where sort_ (ListStorage s) = ListStorage $ map (ListStorage . sortLS) s where sortLS (ListStorage e) = map ListStorage $ sortBy compareLines $ map extr e extr (ListStorage l) = l instance Alphabetizer StorageMap StorageMap StorageMap where sort_ s = IntMap.map (toMap . (map toMap) . (sortBy compareLines)) listListsLists where toMap = foldl add IntMap.empty listListsMaps = IntMap.map IntMap.elems s listListsLists = IntMap.map (map IntMap.elems) listListsMaps