{-# LANGUAGE RecordWildCards #-} module Input.Reorder(reorderItems) where import Input.Item import Input.Settings import Data.List.Extra import Data.Tuple.Extra -- | Reorder items so the most popular ones are first, using reverse dependencies reorderItems :: Settings -> (String -> Int) -> [(a, Item)] -> [(a, Item)] reorderItems Settings{..} packageOrder xs = concatMap snd $ sortOn ((packageOrder &&& id) . fst) $ map rebase $ splitIPackage xs where refunc = map $ second $ \(x:xs) -> x : sortOn (itemName . snd) xs rebase (x, xs) = (x, concatMap snd $ sortOn (((negate . f) &&& id) . fst) $ refunc $ splitIModule xs) where f = reorderModule x